我的UserMailer类有以下RSpec测试:
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
此测试第一次通过,但第二次运行时失败了。在进行一些调试之后,看起来第一个测试向ActionMailer :: Base.deliveries数组添加了一个项目,该项目从未被清除。这导致测试中的第一行失败,因为数组不为空。
在RSpec测试后清除ActionMailer :: Base.deliveries数组的最佳方法是什么?
答案 0 :(得分:81)
由于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
答案 1 :(得分:49)
您可以非常轻松地清除每次测试后的交付,并将其添加到spec_helper.rb中。
RSpec.configure do |config|
config.before { ActionMailer::Base.deliveries.clear }
end
我建议阅读我关于correct emails configuration in Rails的文章,我在那里谈论正确测试它们。
答案 2 :(得分:10)
正如Andy Lindeman指出的那样,清除交付是自动完成的邮件测试。但是,对于其他类型,只需将, :type => :mailer
添加到包装块以强制执行相同的操作。
describe "tests that send emails", type: :mailer do
# some tests
end