この期間の 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::DeliveryJob
は ActionMailer::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 を読むと理解が捗った。