我有以下RSpec测试我的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
这个测试第一次通过了,但第二次失败了。在做了一点调试之后,似乎第一个测试向ActionMailer:: base .交付数组添加了一个项目,并且该项目从未被清除。这会导致测试中的第一行失败,因为数组不是空的。
在RSpec测试后清除ActionMailer:: base .交付数组的最佳方法是什么?
RSpec.describe UserMailer do
before do
# ActionMailer::Base.deliveries is a regular array
ActionMailer::Base.deliveries = []
# or use ActionMailer::Base.deliveries.clear
end
it "sends welcome email" do
user = create(:user)
UserMailer.welcome_email(user).deliver_now
expect(ActionMailer::Base.deliveries).to be_present
end
end
您可以很容易地在每次测试后清除交付,将其添加到spec_helper.rb中。
RSpec.configure do |config|
config.before { ActionMailer::Base.deliveries.clear }
end
我建议阅读我关于Rails中正确的电子邮件配置的文章,其中我也谈到了正确测试它们。
正如Andy Lindeman指出的那样,邮件测试会自动清除交付。但是,对于其他类型,只需将, :type => :mailer
添加到包装块中即可强制执行相同的行为。
describe "tests that send emails", type: :mailer do
# some tests
end