ruby-on-rails - 如何使用 rspec 测试 ActionMailer Deliver_later

标签 ruby-on-rails rspec actionmailer delayed-job rails-activejob

尝试使用delayed_job_active_record升级到Rails 4.2。我没有为测试环境设置delayed_job后端,因为我认为这样作业会立即执行。

我正在尝试使用 RSpec 测试新的“deliver_later”方法,但我不确定如何测试。

旧 Controller 代码:

ServiceMailer.delay.new_user(@user)

新 Controller 代码:

ServiceMailer.new_user(@user).deliver_later

我曾经这样测试过:

expect(ServiceMailer).to receive(:new_user).with(@user).and_return(double("mailer", :deliver => true))

现在我使用它时遇到错误。 (双“邮件程序”收到意外消息:deliver_later(无参数))

只是

expect(ServiceMailer).to receive(:new_user)

也因“nil:NilClass 的未定义方法‘deliver_later’”而失败

我尝试了一些示例,可让您查看是否使用 ActiveJob 中的 test_helper 将作业排队,但我尚未成功测试是否已将正确的作业排队。

expect(enqueued_jobs.size).to eq(1)

如果包含 test_helper,则通过,但它不允许我检查正在发送的电子邮件是否正确。

我想做的是:

  • 测试正确的电子邮件是否已排队(或在测试环境中立即执行)
  • 使用正确的参数 (@user)

有什么想法吗? 谢谢

最佳答案

如果我理解正确,你可以这样做:

message_delivery = instance_double(ActionMailer::MessageDelivery)
expect(ServiceMailer).to receive(:new_user).with(@user).and_return(message_delivery)
allow(message_delivery).to receive(:deliver_later)

关键是您需要以某种方式为deliver_later提供一个 double 值。

关于ruby-on-rails - 如何使用 rspec 测试 ActionMailer Deliver_later,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647749/

相关文章:

ruby-on-rails - 为什么 url hepler 在测试中不起作用?

ruby-on-rails - 在 RSpec 中测试 Resque + Redis

ruby-on-rails - 如何传递额外的数据来设计邮件?

ruby-on-rails - `:location => ...`格式语句中的 `head :ok`和 'respond_to'是什么意思?

javascript - 上传到亚马逊 S3

ruby-on-rails-3 - Rails/Rspec View : The right way to test partials

ruby-on-rails - 如何使用 Rails 在电子邮件主题中添加井号

ruby-on-rails - Rails Mailer "Net::OpenTimeout: execution expired"仅生产服务器上的异常

css - 如何在 CSS 中制作一个可见的矩形框来包含我的 View 的某些部分?

ruby-on-rails - 如何使用 git 维护生产源代码的略有不同的副本?