在RSpectesting后清除ActionMailer :: Base.deliveries

我有我的UserMailer类下面的RSpectesting:

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 

这个testing是第一次通过,但是第二次运行失败了。 在做了一些debugging之后,看起来第一个testing将一个项目添加到ActionMailer :: Base.deliveries数组中,并且该项目从未被清除。 这会导致testing的第一行失败,因为数组不是空的。

在RSpectesting之后清除ActionMailer :: Base.deliveries数组的最好方法是什么?

由于AM :: Base.deliveries只是一个数组,你可以将它初始化为一个空数组。 你可以摆脱第一个检查它也是空的:

 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 

您可以很容易地清除每次testing后的交付,将其添加到您的spec_helper.rb。

 RSpec.configure do |config| config.before(:each) { ActionMailer::Base.deliveries.clear } end 

正如Andy Lindeman所指出的那样,清理邮件是为邮件testing自动完成的。 但是,对于其他types,只需将, :type => :mailer到包装块,以强制执行相同的行为。

 describe "tests that send emails", type: :mailer do # some tests end