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