Voici ma preuve de concept :
require 'spec_helper'
class MyJob < ActiveJob::Base
def perform
OtherJob.perform_later
OtherJob.perform_later
end
end
class OtherJob < ActiveJob::Base
end
describe MyJob do
subject(:my_job) { MyJob.new }
it 'enqueues job' do
expect { my_job.perform }.to have_enqueued_job(OtherJob).at_least(:once)
expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
end
end
Si je comprends bien, have_enqueued_job
vérifie si le travail a été exécuté exactement une fois, donc expect { my_job.perform }.to have_enqueued_job(OtherJob)
est identique à expect { my_job.perform }.to have_enqueued_job(OtherJob).exactly(:once)
.
Mais dans le cas négatif, expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
devient le même que expect { my_job.perform }.not_to have_enqueued_job(OtherJob).exactly(:once)
. Il est donc assez clair pourquoi expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
renvoie true lorsqu'il existe plusieurs tâches du même type, mais le comportement est déroutant.
Essayé avec rspec-rails 3.6.1.
Je ne sais pas ce que vous demandez ici, il semble que votre extrait de code devrait échouer, car expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
signifie que vous n'avez mis en file d'attente aucun travail, et vous l'avez fait. Les attentes ne se connaissent pas.
Vous dites que ça passe ? Parce que c'est un bug.
Je dis que expect { my_job.perform }.to have_enqueued_job(OtherJob).at_least(:once)
passe et expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
passe
J'ai rencontré le même problème. Vous pouvez le pirater avec :
expect{ my_job.perform }.to have_enqueued_job(OtherJob).exactly(0).times
Commentaire le plus utile
J'ai rencontré le même problème. Vous pouvez le pirater avec :