web-dev-qa-db-ja.com

sidekiqワーカー用のテストの作成

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)>'

私は彼らの例に基づいて自分の低レベルのテストを彼らのウィキに基づいていますが、それは私にとってはうまくいきません...これがうまくいかない理由は何ですか?

21
dennismonsewicz

ここでテストする必要があるのは、キュー内のジョブの非同期キューイングとジョブの実行の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
30
Winfield

テスト方法は何ですか?既存のテストをSidekiq::Testing.fake! do <your code> endでラップしてみてください。これにより、偽のキューが使用されます。 sidekiqのテストメソッドが「インライン」の場合、ワーカーはすぐに実行されます(したがって、キューの長さは0になります)。

詳細は https://github.com/mperham/sidekiq/wiki/Testing をご覧ください。

2
cgat