如何测试设置为稍后提供的电子邮件

时间:2018-04-07 16:44:18

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

我无法弄清楚如何使用语法来断言电子邮件已正确排队。具体来说,当参数是对象时,如何将参数传递给邮件程序?

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

  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"}

感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以尝试指定等待时间

first_name = " "

body = """\
Dear {},
Here is new email.
Thanks.
Mike """

def send_test_email(body):
  first_name = 'mike'
  print(body.format(first_name))

send_test_email(body)

# Dear mike,
# Here is new email.                                              
# Thanks.   
# Mike                                                       

deliver_later的更多选项:

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

答案 2 :(得分:0)

我知道这可能为时已晚,无法为您提供帮助,但是我最近遇到了同一问题,因此希望此解决方法对下一个人有所帮助。在后台,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 :(得分:0)

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

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