【问题标题】:Upgrading to Rails 5 and rspec 3.7 no longer sends emails via ActionMailer::Base.deliveries升级到 Rails 5 和 rspec 3.7 不再通过 ActionMailer::Base.deliveries 发送电子邮件
【发布时间】:2018-01-18 18:21:59
【问题描述】:

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

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

我已验证 config/environments/test/rb 具有 config.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

我已经查看并遵循了 Ruby on Rails 从 4.2 -> 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

【问题讨论】:

  • 是的,延迟的作业不会运行,除非您故意运行它们。您可以将所有内容更改为“现在”,或者您可以手动运行延迟的作业......在我们的应用程序中,我们使用 Sidekiq(而不是 ActiveJob),然后在检查电子邮件是否已送达之前执行 Sidekiq::Worker.drain_all。 .YMMV :)

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


【解决方案1】:

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

perform_enqueued_jobs do
    RecordMailer.welcome_email(record).deliver_later
end

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

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多