rspec-sidekiq
gem( https://github.com/philostler/rspec-sidekiq )を使用して、作成中のワーカーをテストしていますが、何らかの理由でテストが失敗し続けます。
これが私のテストです:
require 'spec_helper'
describe CommunicationWorker do
it { should be_retryable false }
it "enqueues a communication worker" do
subject.perform("[email protected]", "[email protected]", [1,2,3])
expect(CommunicationWorker).to have_enqueued_jobs(1)
end
end
ここにエラーがあります:
1) CommunicationWorker enqueues a communication worker
Failure/Error: expect(CommunicationWorker).to have_enqueued_jobs(1)
expected CommunicationWorker to have 1 enqueued job but got 0
# ./spec/workers/communication_worker_spec.rb:9:in `block (2 levels) in <top (required)>'
私は彼らの例に基づいて自分の低レベルのテストを彼らのウィキに基づいていますが、それは私にとってはうまくいきません...これがうまくいかない理由は何ですか?
ここでテストする必要があるのは、キュー内のジョブの非同期キューイングとジョブの実行の2つです。
ジョブクラスをインスタンス化してperform()
を呼び出すことにより、ジョブの実行をテストできます。
ジョブクラスでperform_async()
を呼び出すことにより、ジョブのエンキューをテストできます。
テストで期待値をテストするには、次のことを行う必要があります。
it "enqueues a communication worker" do
CommunicationWorker.perform_async("[email protected]", "[email protected]", [1,2,3])
expect(CommunicationWorker).to have(1).jobs
end
ただし、これは実際にはSidekiqフレームワークをテストするだけであり、有用なテストではありません。ジョブ自体の内部動作のテストを書くことをお勧めします:
it "enqueues a communication worker" do
Widget.expects(:do_work).with(:some_value)
Mailer.expects(:deliver)
CommunicationWorker.new.perform("[email protected]", "[email protected]", [1,2,3])
end
テスト方法は何ですか?既存のテストをSidekiq::Testing.fake! do <your code> end
でラップしてみてください。これにより、偽のキューが使用されます。 sidekiqのテストメソッドが「インライン」の場合、ワーカーはすぐに実行されます(したがって、キューの長さは0になります)。
詳細は https://github.com/mperham/sidekiq/wiki/Testing をご覧ください。