web-dev-qa-db-fra.com

Écrire des tests pour un travailleur de sidekiq

J'utilise la gemme rspec-sidekiq ( https://github.com/philostler/rspec-sidekiq ) pour tester un travailleur que j'écris, mais pour une raison quelconque, mon test échoue sans cesse.

Voici mon test:

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

Voici l'erreur:

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

J'ai basé mon test de bas niveau sur leur exemple sur leur wiki, mais cela ne fonctionne pas pour moi… une raison pour laquelle cela ne fonctionnerait pas?

18
dennismonsewicz

Ici, vous devez tester deux éléments: la mise en file d'attente asynchrone du travail dans la file d'attente et l'exécution du travail.

Vous pouvez tester l'exécution du travail en instanciant la classe de travail et en appelant perform()

Vous pouvez tester la mise en file d'attente du travail en appelant perform_async() sur la classe de travail.

Pour tester l'attente dans votre test, vous devriez faire:

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

Cependant, cela ne fait que tester le framework Sidekiq et ne constitue pas un test utile. Je recommanderais d'écrire des tests pour le comportement interne du travail lui-même:

 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
25
Winfield

Quelle est la méthode de test? Essayez d’emballer votre test existant avec Sidekiq::Testing.fake! do <your code> end. Cela garantira l'utilisation d'une fausse file d'attente. Si les méthodes de test de sidekiq sont 'inline', le serveur sera exécuté immédiatement (et votre file d'attente sera donc de longueur 0).

Consultez: https://github.com/mperham/sidekiq/wiki/Testing pour plus d'informations.

2
cgat