【发布时间】: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