Rspec-rails: Le négatif « have_enqueued_job » ne fonctionne pas comme prévu avec plusieurs tâches du même type

Créé le 13 sept. 2017  ·  3Commentaires  ·  Source: rspec/rspec-rails

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.

Commentaire le plus utile

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

Tous les 3 commentaires

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
Cette page vous a été utile?
0 / 5 - 0 notes