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 のテスト全般に関する詳細情報。