【问题标题】:Rails 6 & deliver_later doesn't affect ActionMailer::Base.deliveriesRails 6 & Deliver_later 不影响 ActionMailer::Base.deliveries
【发布时间】:2020-01-06 14:53:05
【问题描述】:

升级到 Rails 6 后,我注意到默认邮件程序的 .deliver_later 与 Rails 5 中的工作方式不同。

配置:

config.active_job.queue_adapter = :inline

运行Mailer.register_email(...).deliver_later 时,ActionMailer::Base.deliveries 中没有存储任何内容。如果我运行perform_enqueued_jobs,这个数组就会被填满——它看起来像queue_adapter = :inline 并没有按照我期望的方式工作。

如果我运行Mailer.send(...).deliver_now,那么ActionMailer::Base.deliveries 就有适当的价值。

知道为什么会发生这种情况以及如何解决这个问题吗?

【问题讨论】:

  • 这种行为在 Rails 5 和 Rails 6 之间发生了变化。我找不到在哪里,但我确实看到 Rails 现在在他们的 Minitest 电子邮件帮助程序中调用perform_enqueued_jobs。他们添加了一个过滤器以确保仅以这种方式执行电子邮件作业。 github.com/rails/rails/blob/master/actionmailer/lib/…

标签: delayed-job ruby-on-rails-6


【解决方案1】:

我在测试中遇到了同样的问题。在互联网上搜索没有任何结果,所以我开始尝试。

我尝试将发送邮件的调用方法封装在

assert_emails 1 do
  Mailer.register_email(...).deliver_later
end

之后,ActionMailer::Base.deliveries 填充正确。

【讨论】:

    【解决方案2】:

    如果电子邮件的确切数量很容易改变,这是另一种选择:

    assert_changes 'enqueued_jobs.size' do
      # Some code that sends email with deliver_later
    end
    

    这允许您测试是否发送了电子邮件,但它忽略了确切的数字(这是 asserts_emails 方法的限制 - 除此之外,asserts_emails 方法很棒)。 我发现enqueued_jobs 方法对于测试任何后台作业非常有帮助,包括deliver_later

    注意:以上示例仅检查入队作业列表是否已更改。如果您想更具体并检查队列是否已随电子邮件更改,您应该这样做:

    assert_changes 'enqueued_jobs.select {|job| job["job_class"] == "ActionMailer::MailDeliveryJob"}.size' do
      # Some code that sends email with deliver_later
    end
    
    

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 2018-06-30
      • 2011-08-16
      • 1970-01-01
      • 2019-04-10
      • 2015-03-30
      • 1970-01-01
      • 2012-04-15
      • 2012-07-06
      相关资源
      最近更新 更多