0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RSpecでActionMailerのテストでdeliver_laterがある際の対処法

Posted at

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

RailsプロジェクトでRspecでActionMailerのメール送信処理がある際のテストコードを記述していました。
その際に、同期処理である deliver_now と非同期処理である deliver_later が混在している際に、どのようにテストするかでハマったのでメモとして残しておきます。

コードの記述

test.rb の設定で queue_adapter を以下のように設定します。
この設定で基本的に deliver_laterもすぐに実行されることになります。

test.rb
config.active_job.queue_adapter = :inline

ただし、deliver_laterdeliver_later(wait: 5.seconds) と時間を指定して記述しているところはエラーとなってしまいました。理由は調べられていません。

そこで、そのメソッドが書かれている describe の下に include ActiveJob::TestHelper を追加します。

describe 'PATCH #update' do
  include ActiveJob::TestHelper #これを追加。

  it '管理者にメールが1件送信される' do
    expect do
      patch :update, params
    end.to have_enqueued_job.exactly(1).and have_enqueued_job(ActionMailer::DeliveryJob)
  end
end

これ記述することで、config.active_job.queue_adapter = :inline がこの describe の中では自動的に :test となります。
また、have_enqueued_job のマッチャーも使えるようになるため、これでメール送信処理が queue に入ったかどうかテストをすることができます。

以上です。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?