rails have_enqueued_sidekiq_job rspec rspec-rails sidekiq rspec-sidekiq

rspec - have_enqueued_sidekiq_job - Pruebas de escritura para un trabajador de sidekiq.



rspec have_enqueued_sidekiq_job (2)

Estoy usando la gema rspec-sidekiq ( https://github.com/philostler/rspec-sidekiq ) para ayudar a probar a un trabajador que estoy escribiendo, pero por alguna razón mi prueba sigue fallando.

Aquí está mi prueba:

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

Aquí está el error:

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

Basé mi prueba de bajo nivel de su ejemplo en su wiki, pero no funciona para mí ... ¿alguna razón por la que esto no funcionaría?


¿Cuál es el método de prueba? Intente Sidekiq::Testing.fake! do <your code> end su prueba existente con Sidekiq::Testing.fake! do <your code> end Sidekiq::Testing.fake! do <your code> end Esto asegurará que se use una cola falsa. Si los métodos de prueba de sidekiq son ''en línea'', el trabajador se ejecutará de inmediato (y, por lo tanto, su cola tendrá una longitud de 0).

Echa un vistazo a: https://github.com/mperham/sidekiq/wiki/Testing para obtener más información.


Hay dos cosas para probar aquí, la puesta en cola asíncrona del trabajo en la cola y la ejecución del trabajo.

Puede probar la ejecución del trabajo creando una instancia de la clase de trabajo y llamando a perform() .

Puede probar la perform_async() del trabajo llamando a perform_async() en la clase de trabajo.

Para probar la expectativa en su prueba, debería estar haciendo:

it "enqueues a communication worker" do CommunicationWorker.perform_async("[email protected]", "[email protected]", [1,2,3]) expect(CommunicationWorker).to have(1).jobs end

Sin embargo, esto es solo una prueba del marco Sidekiq y no una prueba útil. Recomendaría escribir pruebas para el comportamiento interno del trabajo en sí:

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