【问题标题】:Testing ActionMailer with both paramaters and arguments使用参数和参数测试 ActionMailer
【发布时间】:2022-08-09 23:01:01
【问题描述】:
你如何测试一个同时使用参数和参数的邮件方法。
class UserMailer < ActionMailer::Base
def invoice(invoice)
@user = params[:user]
...
end
end
这些断言都不起作用:
assert_enqueued_email_with UserMailer.with(user), :invoice, args: { invoice }
assert_enqueued_email_with UserMailer.with(user), :invoice, args: [ user, invoice ]
assert_enqueued_email_with UserMailer.with(user), :invoice, params: { user: user }, args: [ invoice ]
标签:
ruby-on-rails
actionmailer
【解决方案1】:
您可以检查排队的工作
它不像assert_enqueued_email_with那么优雅,但是这个方法不能访问参数作为参数
UserMailer.with(user: user).invoice(invoice).deliver_later
job_args = ActiveJob::Base.queue_adapter.enqueued_jobs[0][:args]
assert_equal job_args.first, "UserMailer"
assert_equal job_args.second, "invoice"
assert_equal job_args.fourth["params"]["user"], user
assert_equal job_args.fourth["args"], [invoice]
还有assert matcher for enqueued job。并且可以使用 4 个参数的数组检查 ActionMailer::MailDeliveryJob 并将邮件传递传递给块
assert_enqueued_with(job: ActionMailer::MailDeliveryJob, args: ["UserMailer", "invoice", "deliver_now", { params: { user: user }, args: [invoice] }], queue: "default") do
UserMailer.with(user: user).invoice(invoice).deliver_later
end
【解决方案2】:
这已在 Rails edge 上更新为PR。您现在可以按如下方式使用断言:
assert_enqueued_email_with UserMailer.with(user), :invoice, args: [ user, invoice ]