Wie überbrücken wir die Tests mit Resque mit Rspec Beispiele?
Ich habe eine Verwirrung bei der Umsetzung Resque parallel mit Rspec Beispiele.
Das folgende ist eine Klasse mit teuren Methode .generate(self)
class SomeClass
...
ChangeGenerator.generieren(selbst -)
...
Ende
Nach der Implementierung resque, die über Klasse folgt geändert und ergänzt eine ChangeRecorderJob Klasse.
class SomeClass
...
Resque.enqueue(ChangeRecorderJob, self.id)
...
end
class ChangeRecorderJob
@queue = :change_recorder_job
def self.perform(noti_id)
notification = Notification.find(noti_id)
ChangeGenerator.generate(notification)
end
end
Funktioniert es perfekt. Aber ich habe 2 Bedenken.
Bevor Sie in meinem Beispiel-Skillung zu testen, die ganze Stapel von .generate(self)
Methode. Aber jetzt, da ich darauf gedrängt, daß in Resque job, wie kann ich überbrücken meine Beispiele machen den gleichen test grün ohne Isolierung? Oder muss ich isolieren den test??
Und zu guter Letzt, wenn ich 10 Arbeitsplätze zu enque, habe ich, um 10 separate job-Klassen mit self.perform
Methode?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Testen von asynchronen sowas ist immer schwierig. Was wir tun, ist:
In unserer funktionalen tests stellen wir sicher, dass der job wird in die Warteschlange eingereiht. Mit Mokka oder etwas ähnliches mit einer Erwartung ist normalerweise ausreichend. Wenn Sie möchten, um einen test der redis-server verwenden, können Sie überprüfen Sie die korrekte Warteschlange wuchs und, dass der job params korrekt sind. Obwohl Sie sind Tests, Resque, selbst ein wenig an dieser Stelle.
Arbeitsplätze sind isoliert getestet als unit-tests. Da Sie nur eine Methode der Klasse aufgerufen
perform
Ihre unit-tests sind ganz einfach. In Ihrem Fall würden Sie testen, dass ChangeRecorderJob.führen Sie das tut, was Sie wollen. Wir neigen dazu, zu testen, die Arbeitsplätze sind auf die entsprechende Warteschlange, dass die params der job gültig sind und den job tut, was wir wollen.Nun, um zu testen, alles zusammen ist der schwierige Teil. Ich habe dies auf zwei verschiedene Arten und jede hat vor-und Nachteile:
Monkey-patch Resqueue.enqueue, um die Arbeit synchronAls der resque 1.14.0, die Sie verwenden könnenResque.inline = true
in Ihrem Initialisierung statt der monkey-patchingAusführen der Aufgabe synchron ist bei weitem die einfachere der beiden. Sie hatte gerade die Last etwas wie das folgende in deiner spec_helper:Als der resque 1.14.0 können Sie nur setzen
Resque.inline = true
in Ihrem Initialisierung statt der monkey-patching. Wenn Sie stecken in einer älteren version von resque, der monkey-patch erforderlich ist.Beachten Sie, dass Sie synchron laufen hier, Sie gehen, um die Kosten Ihrer lange Laufenden Auftrag. Vielleicht noch wichtiger ist, du gehst zu laufen in dem gleichen Prozess, also es ist nicht eine völlig genaue Darstellung von, wie Ihre Arbeit ausgeführt wird.
Ausführung des Auftrags, die in einem gegabelten Arbeiter, ähnlich wie resque würde, müssen Sie etwas tun, wie die folgenden:
Es gibt eine leichte Verzögerung in das bekommen die Arbeitnehmer-pop-die Aufgabe aus der Warteschlange. Und natürlich werden Sie brauchen, um einen test der redis-server ausgeführt, so dass der Arbeiter hat eine Warteschlange, um pop-off.
Ich bin sicher, andere Leute kommen mit cleveren Arten der Prüfung resque Arbeitsplätze. Diese sind, was die gearbeitet haben für mich.
Resque.inline = true
ist eine clevere Lösung, aber wie gesagt kann Dinge machen träge, und den ich getroffen habe, Fällen in einige schlampig geschriebenen code, wo laufen Sie synchron hatte andere Ergebnisse als asynchron läuft. Es wäre cool, wenn Resque hatte eine test-helper, wo Sie tun könnte, rufe wieResque.last_job
,Resque.process!
, undResque.clear!
.Verwenden resque_spec für unit-Tests.
Sowie für Ihre integration tests:
Müssen Sie tun, zwei verschiedene tests. Eine für enquing, um sicherzustellen, dass die jobs werden in die Warteschlange eingereiht in die Resque-Warteschlangen und die zweite für die Herstellung sicher, dass die Aufträge in der Warteschlange bei der Abholung durch den Arbeitnehmer durchgeführt werden, um Ihre Anforderungen.
Nein, Sie brauchen nicht zu schreiben 10 verschiedene Methoden führen. Beim ausführen von Resque Arbeiter, dann Holen Sie sich die jobs aus der queue und blind zu nennen .durchführen Methode auf Ihren job. So, Ihr job ist zu erwarten, dass die perform-Methode.
.perform
- Methode in jedem. Diese 3 stellen sind für das gleiche Modell. Also statt zu schreiben 3 separate job-Klasse, wie Sie schreiben, diese 3.perform
in einem einzigen job Klasse?perform
Methode nimmt varargs. Man könnte hinzufügen, eine Diskriminator-Wert, wenn Sie wollte und dann Ihr Einzelperform
konnte nur Versand an egal welche Methode bietet die Funktionalität, die Sie benötigen.