web-dev-qa-db-fra.com

Effacement d'ActionMailer :: Base.deliveries après le test RSpec

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?

58
Kevin Pang

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
81
Peter Brown

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.

49
coorasse

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
10
d_rail