Rails 6 に更新するとメール送信のテストに失敗した
Rails で作成しているサンプルアプリケーションを Rails6 に更新したところ、メール送信の RSpec テストが失敗しました。
発生したこと
以下のような RSpec のシステムテストがありました。
scanario 'メール送信' do
# メール送信する操作を実行
mail = ActionMailer::Base.deliveries.last
aggregate_failures do
expect(mail.to).to eq ["[email protected]"]
...
end
end
元々、Rails のバージョンは 5.2.3 でしたが、6.0.0 に更新してテストを実行すると以下のようなエラーになりました。
Failure/Error: expect(mail.to).to eq ["[email protected]"]
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
に変更されたことが原因ではないかと思われます。
Author And Source
この問題について(Rails 6 に更新するとメール送信のテストに失敗した), 我々は、より多くの情報をここで見つけました https://qiita.com/uehara_delta/items/3f69c887668bc57d1432著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .