Techioz Blog

Rails: インラインアダプターを使用してテスト内で ActiveJob を正しく実行するにはどうすればよいですか?

概要

次のテストがあります。

require "test_helper"

class DisbursementGenerationTest < ActionDispatch::IntegrationTest
  test "disburse test orders" do
    puts "Performing job..."
    Merchant.all.each do |merchant|   
      DisburseJob.perform_later(merchant)      
    end
    puts "Job performed"
    sleep 10
    assert_equal 2, Disbursement.count
  end
end

/config/environment/test.rb で、ActiveJob キュー アダプターをインラインに設定します。

Rails.application.configure do
  config.active_job.queue_adapter = :inline

テスト中のジョブはまったく実行されません。両方の put ステートメントからの出力が表示されますが、ジョブが実行されていません。予想通り、2 つの販売者オブジェクトがあることを確認しました。開発環境では、sidekiq をジョブ バックエンドとして使用しており、Rails コンソールから手動でジョブを実行することも、アプリ内でスケジュールされたジョブも正常に実行します。

テスト内で ActiveJob を正しく実行するにはどうすればよいですか?

テストを実行したところ、ジョブが 2 回 (販売者オブジェクトごとに 1 回) 実行されることが予想されました。ジョブはまったく実行されていません。

解決策

テストするには、キュー アダプターをテストするように設定する必要があります。

  config.active_job.queue_adapter = :test

そして、perform_enqueued_jobs を使用してジョブを実行できます。

class DisbursementGenerationTest < ActionDispatch::IntegrationTest
  test "disburse test orders" do
    Merchant.all.each do |merchant|   
      DisburseJob.perform_later(merchant)      
    end

    perform_enqueued_jobs

    assert_equal 2, Disbursement.count
    assert_performed_jobs 2
  end
end

テスト ヘルパーと AJ のテスト全般に関する詳細情報。