Rails で作成しているサンプルアプリケーションを Rails6 に更新したところ、メール送信の RSpec テストが失敗しました。
発生したこと
以下のような RSpec のシステムテストがありました。
scanario 'メール送信' do
# メール送信する操作を実行
mail = ActionMailer::Base.deliveries.last
aggregate_failures do
expect(mail.to).to eq ["admin@example.com"]
...
end
end
元々、Rails のバージョンは 5.2.3 でしたが、6.0.0 に更新してテストを実行すると以下のようなエラーになりました。
Failure/Error: expect(mail.to).to eq ["admin@example.com"]
NoMethodError:
undefined method `to' for nil:NilClass
ActionMailer::Base.deliveries
が空のため、送信したメールが取得できずエラーになったようです。
開発環境で動作確認すると、メール送信処理自体は特に問題ないように見えます。
解決方法
テストに以下の設定を追加しました。
ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
これで、ActionMailer::Base.deliveries
に送信したメールが格納されるようになりました。
参考にしたページ
-
https://stackoverflow.com/questions/57854609/upgrade-to-rails-6-broke-my-actionmailer-test
同じように Rails6 に更新したことでActionMailer::Base.deliveries
に送信したメールが格納されない問題についての質問記事です。
結局この質問では、質問者がメール送信するコードをassert_emails
メソッドで囲むことで解決したとポストされていますが、私の場合は解決しませんでした。 -
https://github.com/rails/rails/blob/master/actionmailer/test/message_delivery_test.rb
Rails の Action Mailer のテストをみると、上記queue_adapter
についての設定が記載されていたので、これを参考にして解決できました! -
https://railsguides.jp/6_0_release_notes.html#action-mailer
Rails6 になってメール送信に使用されるジョブがActionMailer::DeliveryJob
からActionMailer::MailDeliveryJob
に変更されたことが原因ではないかと思われます。