株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
RailsプロジェクトでRspecでActionMailerのメール送信処理がある際のテストコードを記述していました。
その際に、同期処理である deliver_now
と非同期処理である deliver_later
が混在している際に、どのようにテストするかでハマったのでメモとして残しておきます。
コードの記述
test.rb
の設定で queue_adapter
を以下のように設定します。
この設定で基本的に deliver_later
もすぐに実行されることになります。
config.active_job.queue_adapter = :inline
ただし、deliver_later
で deliver_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
に入ったかどうかテストをすることができます。
以上です。