ruby on rails -清除RSpec测试后的ActionMailer:: base .交付



我有以下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

最新更新