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