J'ai le test RSpec suivant pour ma classe UserMailer:
require "spec_helper"
describe UserMailer do
it "should send welcome emails" do
ActionMailer::Base.deliveries.should be_empty
user = Factory(:user)
UserMailer.welcome_email(user).deliver
ActionMailer::Base.deliveries.should_not be_empty
end
end
Ce test a réussi la première fois, mais a échoué la deuxième fois que je l'ai exécuté. Après avoir fait un peu de débogage, il semble que le premier test a ajouté un élément au tableau ActionMailer :: Base.deliveries et cet élément n'a jamais été effacé. Cela provoque l'échec de la première ligne du test car le tableau n'est pas vide.
Quelle est la meilleure façon d'effacer le tableau ActionMailer :: Base.deliveries après un test RSpec?
Comme AM :: Base.deliveries n'est qu'un tableau, vous pouvez l'initialiser dans un tableau vide. Vous pouvez aussi vous débarrasser de la première vérification qu'il est vide:
describe UserMailer do
before { ActionMailer::Base.deliveries = [] }
it "should send welcome emails" do
user = Factory(:user)
UserMailer.welcome_email(user).deliver
ActionMailer::Base.deliveries.should_not be_empty
end
end
Vous pouvez effacer les livraisons après chaque test assez facilement, en les ajoutant dans votre spec_helper.rb.
RSpec.configure do |config|
config.before { ActionMailer::Base.deliveries.clear }
end
Je suggère de lire mon article sur le configuration correcte des emails dans Rails où je parle également de les tester correctement.
Comme le souligne Andy Lindeman, l'effacement des livraisons se fait automatiquement pour les tests d'envoi. Cependant, pour d'autres types, ajoutez simplement , :type => :mailer
au bloc d'habillage pour forcer le même comportement.
describe "tests that send emails", type: :mailer do
# some tests
end