1. ホーム
  2. ruby-on-rails

[解決済み] ActionMailerのdeliver_laterをrspecでテストする方法

2023-05-26 19:49:19

質問

Rails 4.2にアップグレードしようとしているのですが、delayed_job_active_recordを使用しています。テスト環境ではdelayed_jobバックエンドを設定せず、その方がジョブがすぐに実行されると思ったからです。

新しい'deliver_later'メソッドをRSpecでテストしようとしているのですが、方法がよくわかりません。

古いコントローラのコードです。

ServiceMailer.delay.new_user(@user)

新しいコントローラのコードです。

ServiceMailer.new_user(@user).deliver_later

私はこのようにテストするためにUSEDを使用しました。

expect(ServiceMailer).to receive(:new_user).with(@user).and_return(double("mailer", :deliver => true))

今、それを使っているとエラーが出ます。(Double "mailer" received unexpected message :deliver_later with (no args)).

ただ

expect(ServiceMailer).to receive(:new_user)

failure with 'undefined method `deliver_later' for nil:NilClass' (nil:NilClassのための未定義のメソッド `deliver_later')で、これも失敗します。

ActiveJobのtest_helperを使ってジョブがキューイングされているかどうかを確認できる例をいくつか試してみましたが、正しいジョブがキューイングされているかどうかをテストすることはできていません。

expect(enqueued_jobs.size).to eq(1)

これは、test_helperが含まれている場合は通過しますが、送信されるメールが正しいかどうかを確認することはできません。

私がやりたいことは

  • 正しいメールがキューに入るかテストする (または test 環境ですぐに実行する)
  • 正しいパラメータ(@user)で

何かアイデアはありますか? 感謝

どのように解決するのですか?

私が正しく理解していれば、あなたはできるはずです。

message_delivery = instance_double(ActionMailer::MessageDelivery)
expect(ServiceMailer).to receive(:new_user).with(@user).and_return(message_delivery)
allow(message_delivery).to receive(:deliver_later)

重要なことは、何らかの方法で、ダブルを提供する必要があるということです。 deliver_later .