【问题标题】:How to test emails that are set to deliver later如何测试设置为稍后发送的电子邮件
【发布时间】:2018-04-07 16:44:17
【问题描述】:

我不知道如何让语法起作用以断言电子邮件已正确入队。具体来说,当参数是对象时,如何将参数传递给邮件程序?

例如,如果您想将联系人对象传递给文档中的示例:

  assert_enqueued_email_with ContactMailer, :welcome, @contact do
    ContactMailer.welcome(@contact).deliver_later
  end

  assert_enqueued_email_with ContactMailer, :welcome, args: @contact do
    ContactMailer.welcome.deliver_later
  end

  assert_enqueued_email_with ContactMailer, :welcome, [@contact] do
    ContactMailer.welcome.deliver_later
  end

这些似乎都不起作用。如果您查看实际排队的作业,该对象如下所示:

{:job=>ActionMailer::DeliveryJob, :args=>["ContactMailer", "welcome", "deliver_now", {"_aj_globalid"=>"gid://app_name/Contact/1015983224"}], :queue=>"mailers"}

感谢任何帮助!

【问题讨论】:

    标签: ruby-on-rails actionmailer ruby-on-rails-5.2


    【解决方案1】:

    你需要传递一个参数数组:

    assert_enqueued_email_with ContactMailer, :welcome, args: [@contact] do
      ContactMailer.welcome(@contact).deliver_later
    end
    

    【讨论】:

      【解决方案2】:

      我知道这可能为时已晚,无法帮助您,但我最近遇到了同样的问题,因此希望此解决方法可以帮助下一个人。在底层,assert_enqueued_email_with 只使用了assert_enqueued_with,我们可以直接使用它来创建一个测试,这样可以找到入队的电子邮件。

      assert_enqueued_with(job: ContactMailer.delivery_job, args: ['ContactMailer', 'welcome', 'deliver_now', @contact], queue: 'mailers')
      

      此测试与 assert_enqueued_email_with 生成的唯一区别是 @contact 没有包装在额外的数组中。

      编辑:我想再次提及我只是在从 Rails 5.2 更新到 Rails 6.0 的过程中遇到这个错误。一旦我进一步了解更新,它就消失了,assert_enqueued_with 按预期工作,而之前使用 assert_enqueued_with 的解决方法不再匹配。具体来说是在将 delivery_job 设置为新的默认值之后。

      Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,所以我的解决方案是直接访问排队的作业数组并手动进行比较。

        assert_equal ActiveJob::Base.queue_adapter.enqueued_jobs[0][:args][0], "UserMailer"
        assert_equal ActiveJob::Base.queue_adapter.enqueued_jobs[1][:args][0], "MarketingMailer"
        

        【讨论】:

          【解决方案4】:

          您可以尝试指定等待时间

          Notifier.welcome(User.first).deliver_later(wait: 1.hour)
          

          deliver_later 的更多选项:

          http://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-deliver_later

          【讨论】:

          • 我不确定你的意思?问题是 assert_enqueued_email_with 方法似乎不适用于将对象作为参数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-20
          相关资源
          最近更新 更多