タケユー・ウェブ日報

Ruby on Rails や Flutter といった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