タケユー・ウェブ日報

Webシステム受託会社の業務の中での気づきや調べごとのメモ。

rspec で ActionMailer の deliver_later のジョブはすぐに処理する

ActiveJob へのキューインの spec で示したように ActiveJob::Base.queue_adapter = :test を使うと、 perform_later のジョブはキューに溜まるようになる。

しかし、 ActionMailer の deliver_later で非同期送信を使っている場合にまでキューインされてしまうと、 「メールを送信する」ことのテストを書きづらいことがある。

まとめ

  • ActiveJob::TestHelper に含まれる perform_enqueued_jobs を使うと、ブロック内ではエンキューされたジョブはすぐに実行される
  • only: ActionMailer::MailDeliveryJob と指定すれば、メール送信のみすぐに実行できる

サンプルコード

include ActiveJob::TestHelper

it "It sends the server key" do
  expect {
    perform_enqueued_jobs(only: ActionMailer::MailDeliveryJob) { NotifyJob.perform_now(user) }
  }.to change(ActionMailer::Base.deliveries, :count).by(1)
  
  mail = ActionMailer::Base.deliveries.last
  expect(mail.attachments.map(&:filename)).to match_array(["key.pem"])
end

ActiveJob::TestHelper

api.rubyonrails.org