在RSpec测试后清除ActionMailer :: Base.deliveries

时间:2011-04-30 16:59:21

标签: ruby-on-rails unit-testing rspec actionmailer

我的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数组的最佳方法是什么?

3 个答案:

答案 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