【问题标题】: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 ]
      

      【讨论】:

        猜你喜欢
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 2013-11-27
        • 2010-09-22
        相关资源
        最近更新 更多