升级到Rails 5和rspec 3.7不再通过ActionMailer :: Base.deliveries发送电子邮件

时间:2018-01-18 18:22:00

标签: email rspec ruby-on-rails-5 actionmailer

我有一个使用rspec和Rails 4.2.8的功能规范套件。我相应地升级到Rails 5.0.6和rspec 3.7。

许多规范都有效,但我发送电子邮件的规范实际上都没有将电子邮件添加到ActionMailer::Base.deliveries数组中。

我已经确认config/environments/test/rbconfig.action_mailer.delivery_method = :test将任何已发送的电子邮件添加到阵列,而不是实际发送。

我怀疑它与ActiveJob有关,因为当我在我的规范中通过SomeMailer.some_method().deliver_later发送电子邮件时,它会返回一个ActionMailer::DeliveryJob对象,但它不会添加ActionMailer::Base数组的任何内容。

当我致电SomeMailer.some_method().deliver_now时,我发现电子邮件实际上已添加到ActionMailer::Base数组中。我想知道对于我的规格我是否只需要将它们配置为全部使用deliver_now而不是deliver_later

我已经审核并遵循了4.2 - >中的Ruby on Rails升级指南。 5.0并且无法弄清楚这一点。

我的电子邮件规格遵循以下格式:

# spec/models/record_spec.rb
require "rails_helper"

describe Model do
  describe "#method" do
    it "sends email" do
      record = Record.create(attributes = {})
      RecordMailer.welcome_email(record).deliver_later

      last_email = ActionMailer::Base.deliveries.last
      expect(last_email.subject).eq ("Welcome")
    end
  end
end

1 个答案:

答案 0 :(得分:0)

假设您在某处包含 ActiveJob :: TestHelper ,您可以包装 deliver_later (或者如果在功能规范中,例如按钮点击触发交付)在 perform_enqueued_jobs 块内:

perform_enqueued_jobs do
    RecordMailer.welcome_email(record).deliver_later
end

现在您的 ActionMailer :: Base.deliveries 应该包含通过ActiveJob发送的电子邮件。