Wie Devise Async mit Sidekiq zu testen?

8

Vielen Dank im Voraus! Sidekiq funktioniert gut, aber ich kann es nicht mit Devise Async testen, oder sollte ich sagen, dass ich letzteres nicht testen kann?

Laut der Dokumentation von Sidekiq wird, wenn der Testmodus auf "Fake!" gesetzt ist, jeder Job, der einem Worker übergeben wird, in ein Array namens " jobs " desselben Workers verschoben. Es ist also trivial, die Zunahme dieses Arrays zu testen.

Aber mit Devise Async ist es nicht so trivial, obwohl sein Backend Sidekiq::Worker enthält. Hier ist eine kleine Liste von Dingen, die ich zu testen versuchte:

  • Devise::Async::Backend::Sidekiq.jobs
  • Devise::Mailer.deliveries
  • ActionMailer::Base.deliveries
  • Devise::Async::Backend::Worker.jobs

Keines dieser Testobjekte weist auf eine Größenzunahme hin. Da Devise seine E-Mails als Modellrückrufe sendet, habe ich versucht, sowohl in einem Modell als auch in einer Controller-Spezifikation zu testen. Mit Factory Girl und Database Cleaner habe ich auch beide Modi ausprobiert: Transaktion und Trunkierung. Unnötig zu sagen, dass ich auch beide Modi von Sidekiq ausprobiert habe: Fake! und inline!.

Was vermisse ich?

    
Paulo Oliveira 21.11.2014, 18:35
quelle

2 Antworten

1

Wie in der Dokumentation erwähnt, können Sie die Warteschlange überprüfen Größe wie

%Vor%     
abhinavmsra 08.07.2015 13:33
quelle
0

Ich habe an diesem Problem gearbeitet, nachdem ich eine schöne Implementierung von gitlab entdeckt hatte, die ich für hilfreich halten könnte, um Geräte-async oder E-Mails zu testen, die über die sidekiq-Warteschlange gepusht werden. spec_helper.rb email_helpers.rb

Durch Hinzufügen dieser Zeilen in spec_helper.rb

%Vor%

Und /spec/support/email_helpers.rb

hinzufügen %Vor%

Um den Test zum Beispiel auszuführen, um Ihr vergessenes Passwort zu testen, gehe ich davon aus, dass Sie rspec, factorygirl, capybara kennen   /spec/features/password_reset_spec.rb

%Vor%

Sie würden das in dieser Test-Implementierung bemerken

  1. bewirkt, dass sidekiq den Job ausführt, anstatt ihn in die Warteschlange einzureihen,
  2. Das E-Mail-Attribut des Benutzermodells muss email heißen oder Sie können einfach den obigen Code ersetzen.
  3. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 Überprüfen Sie, ob ActionMailer :: Base.deliveries an user.email
  4. liefert
Kenny Chan 11.05.2016 02:25
quelle