0
0

More than 1 year has passed since last update.

【Ruby on Rails】ActionMailer deliver_laterのrspecについての検討

Last updated at Posted at 2022-01-26

前提

メール送信処理はすべてdeliver_nowで書いていましたが、処理が重過ぎてタイムアウトするのでdeliver_laterに書き直しました。
結果rspecが軒並み死にました。FFF...
まぁ、そのままではうまくいかんだろうなという予感はしていました。
ということで、rspecの書き方を検討します。

deliver_laterのrspecとして有効そうなこと

deliver_laterActiveJobの処理なので、ActiveJobに近いテストを書くことはできそうです。

  • jobの登録有無
  • jobの内容

あとは、メール送信処理を即時にすれば、メールの内容などのテストも可能です。
deliver_laterのテストは正直rails側で担保されていると思うので、deliver_laterを即時に変えるテストは有効かと思ってます。
意外と、deliver_later用!っていうrspecは用意されていないようです。調べ方が悪いかもしれないので、ありましたら教えていただきたいです…。mm

modelのテストをjobの登録の確認。
controllerのテストは即時でメールを送信して、メールの内容を確認する。
という役割でテストを書きました。model, controllerで担保するテストの切り分けが未だにわかっていないです。

一応、メールの送信と内容の確認は統合テストに近いのでcontrollerで担保するのが良いかなと考えた結果です。
job登録と即時への変更のテストをmodelとcontrollerで二重で書いてもよいのですが、すでにrspecはほとんど出来上がっており、deliver_laterに変えたことによる影響範囲は莫大だったので止めました。
というかこれだけの変更でもかなり骨が折れました。はじめからdeliver_laterにしておけばよかった。

実際に書いたrspec

同期処理をrspecで使うために以下を追記

rails/spec/rails_helper.rb
ActiveJob::Base.queue_adapter = :test

modelのテストは、jobの登録確認なので以下のように書きました。
Mailerのactionで登録されるようです。

rails/spec/models/test_spec.rb
context "trueの場合" do
  it "メールのjobが登録される" do
    expect {
      test.hoge_method(true)
    }.to have_enqueued_mail(HogeMailer, :send_mail)
  end
end
context "falseの場合" do
  it "メールのjobが登録されない" do
    expect {
      test.hoge_method(false)
    }.not_to have_enqueued_mail(HogeMailer, :send_mail)
  end
end

controllerのテストは、即時実行に変更しました。
beforeでperform_enqueued_jobs囲うと、即時で実行してくれました。
requestsの今までのテストを全部これで囲いました(戦慄)。

rails/spec/requests/users_spec.rb
context "postした場合" do
  after { ActionMailer::Base.deliveries.clear }

  before do
    perform_enqueued_jobs do
      post "/users/send_mail"
    end
  end

  it "メールが送信される" do
    mailer = ActionMailer::Base.deliveries[0]
    expect(mailer).not_to eq nil
    expect(mailer.to[0]).to eq "test@dev.hogehoge.jp"
  end
end

これでrspecはオールグリーンになりました〜!

その他

enqueued_jobs[0][:args]でもjobに登録された値を取ってきて内容に関してのテストができそうでした。
が、私の環境だとbccあたりしか入っておらず、paramsでmailerのactionに渡したものしか入ってないのかも?と思ってます。ここの処理が怪しいので調べてわかったことがあれば追記しようと思います…。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0