ruby-on-rails rspec rails-activejob

ruby on rails - ¿Cómo probar que ActiveJob está en cola?



ruby-on-rails rspec (2)

Siempre he considerado el tamaño de ActiveJob::Base.queue_adapter.enqueued_jobs para probar si se llamó a un trabajo. dando el código

it ''does something'' do expect { post :create, { object: valid_attributes } }.to change { ActiveJob::Base.queue_adapter.enqueued_jobs.count }.by 1 end

Debe asegurarse de que está configurando enqueued_jobs en una matriz vacía después de cada especificación para evitar cualquier comportamiento inesperado. Puedes hacer esto en spec/rails_helper.rb

Tengo una acción de creación que llama a ActiveJob si el registro se guarda con éxito.

def create @object = Object.new(importer_params) respond_to do |format| if @object.save MyJob.perform_later( @object.id ) format.html { redirect_to @object, notice: t(''.notice'') } else format.html { render :new } end end end

Quiero probar que el trabajo se llama correctamente en una especificación de controlador.

describe "POST #create" do it { expect { post :create, { object: valid_attributes } }.to change(Object, :count).by(1) } it { expect { post :create, { object: valid_attributes } }.to have_enqueued_job(MyJob) } end

Pero yo obtengo

Failure/Error: expect { post :create, { object: valid_attributes } }.to have_enqueued_job(MyJob) expected to enqueue exactly 1 jobs, but enqueued 0

La primera prueba está pasando, entonces sé que el Objeto se guardó exitosamente. ¿Cuál es la forma correcta de probar que un ActiveJob está en cola?


Si necesita verificar que su trabajo haya sido en cola varias veces, puede hacerlo ahora:

expect { 3.times { HelloJob.perform_later } }.to have_enqueued_job(HelloJob).at_least(2).times