株式会社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 に入ったかどうかテストをすることができます。
以上です。