我无法弄清楚如何使用语法来断言电子邮件已正确排队。具体来说,当参数是对象时,如何将参数传递给邮件程序?
例如,如果要将联系对象传递给文档中的示例:
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"}
感谢任何帮助!
答案 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"