Rails CHANGELOG "2019-10-28".."2019-11-03"

この期間の CHANGELOG.md へのコミットは1件。

ActionMailerに関しての1件のみ。

ActionMailer

テストヘルパーの assert_enqueued_emails メソッドが ActionMailer::Parameterized::DeliveryJob に対して期待通りに動作しない不具合を修正した

コミット: Fix ActionMailer assertions don't work for parameterized mail with le… · rails/rails@37b72ff

具体的に起きていた問題はこのissue assert_enqueued_emails does not work when sending a parameterized email · Issue #37605 · rails/rails に書いてある。

読んでみると ActionMailer::DeliveryJob を使ったこれ↓はテスト通るけど、

assert_enqueued_emails 1 do
  SubscriptionMailer.welcome.deliver_later
end

ActionMailer::Parameterized::DeliveryJob を使ったこれ↓はテスト通らない、

assert_enqueued_emails 1 do
  SubscriptionMailer.with(User.first).welcome.deliver_later
end

という問題が起きていたらしい。

ふむふむ。

ActionMailer::DeliveryJob は非同期でメール送信を行ないたい場合に使うやつ。

ActionMailer::Parameterized::DeliveryJobActionMailer::DeliveryJob を継承している。

ざっくりいうとこの2つは .with(params) でパラメータを渡すかどうかの違いしかない(雑)

ActionMailer::DeliveryJob

def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
  mailer.constantize.public_send(mail_method, *args).send(delivery_method)
end

引用: rails/delivery_job.rb at f5050d998def98563f8fa4b381c09f563681f159 · rails/rails

ActionMailer::Parameterized::DeliveryJob

def perform(mailer, mail_method, delivery_method, params, *args)
  mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
end

引用: rails/parameterized.rb at 5d6578d15bb5d3bfe3751a6493b9e3fe99618408 · rails/rails

なんで同じようなことやってるのに後者だとテスト落ちるの?という話。

原因はActionMailer::TestHelper でジョブクラスを判定する際に使われている delivery_job_filter メソッド。 ActionMailer::Parameterized::DeliveryJob の考慮が漏れていた。


ちなみに ActionMailer::DeliveryJob を使うと「Rails 6.1系で消す予定だよ〜、代わりに MailDeliveryJob を使ってね〜」とwarningが出る。

before_perform do
  ActiveSupport::Deprecation.warn <<~MSG.squish
    Sending mail with DeliveryJob and Parameterized::DeliveryJob
    is deprecated and will be removed in Rails 6.1.
    Please use MailDeliveryJob instead.
  MSG
end

引用: rails/delivery_job.rb at f5050d998def98563f8fa4b381c09f563681f159 · rails/rails

この記事 Rails6 のちょい足しな新機能を試す41(MailDeliveryJob 編) - Qiita を読むと理解が捗った。