Gibt es eine Möglichkeit, Variablen zu verfolgen, die bei Verwendung von let? erstellt werden?
Ich habe eine Reihe von Tests, von denen einige let (: server) {#blah blah} verwenden. Ein Teil des Blahs besteht darin, auf den Start des Servers zu warten, damit er in einem anständigen Zustand ist, bevor er benutzt wird.
Das Problem kommt, wenn ich mit diesem Test fertig bin. Ich möchte den Server mit server.kill () töten. Dies wäre fast perfekt, wenn ich etwas zu dem Effekt von
sagen könnte %Vor%Aber das würde den Server erstellen und alle Ressourcen / Zeit verschwenden, um es zu erstellen, wenn es referenziert wird, nur um es sofort zu töten, wenn der Server im vorhergehenden Test nicht verwendet wurde. Gibt es eine Möglichkeit, den Server im Auge zu behalten und ihn nur zu bereinigen, wenn er benutzt wurde?
Ich bin auf ein ähnliches Problem gestoßen. Eine einfache Möglichkeit, dies zu lösen, besteht darin, eine Instanzvariable in der let-Methode zu setzen, um zu verfolgen, ob das Objekt erstellt wurde:
%Vor%Das ist definitiv ein Hack:
%Vor% Ich dachte, dass rspec diese Lazy-Werte irgendwo speichern müsste, wo die Instanz auf sie zugreifen könnte, und __memoized
ist dieser Ort.
Mit einem Helfer wird es etwas aufgeräumter:
%Vor%Es gibt jedoch noch Raum für Verbesserungen. Ich denke, ich würde den Namen des Objekts lieber nicht zweimal eingeben müssen, also wäre so etwas schöner:
%Vor%Ich bin mir nicht sicher, ob ich das tun kann, ohne rspec in Stücke zu hacken, aber vielleicht, wenn rspec selbst den Vorteil davon gesehen hat, könnte etwas im Kern getan werden ...
Bearbeiten: Wurde zu instance_exec
geändert, weil rspec zu jammern anfing, wenn die Dinge aus dem falschen Kontext aufgerufen wurden, und die Bereinigung in after(:context)
geändert wurde, weil dies offensichtlich der Level ist, an dem es sich befindet.
Schreiben Sie einfach einen kleinen Decorator, der sowohl das explizite als auch das implizite Starten des Servers behandelt und mit dem Sie feststellen können, ob der Server gestartet wurde.
Stellen Sie sich vor, dass dies der richtige Server ist, der gestartet werden muss:
%Vor%Der wiederverwendbare Dekorateur könnte so aussehen:
%Vor%Nun können Sie dies in Ihren Spezifikationen wie folgt anwenden:
%Vor% Wenn eine Methode für den Decorator aufgerufen wird, wird eine eigene Implementierung ausgeführt, falls eine existiert. Wenn zum Beispiel #started?
aufgerufen wird, wird es antworten, ob der tatsächliche Server gestartet wurde oder nicht. Wenn es keine eigene Implementierung dieser Methode hat, delegiert es den Methodenaufruf an das von ihm zurückgegebene Serverobjekt. Wenn es zu diesem Zeitpunkt keinen Verweis auf eine Instanz des tatsächlichen Servers hat, wird das bereitgestellte start_procedure
ausgeführt, um eins zu erhalten und dieses für zukünftige Aufrufe zu speichern.
Wenn Sie den gesamten gebuchten Code in eine Datei namens server_spec.rb
setzen, können Sie ihn mit:
Die Ausgabe wird wie folgt aussehen:
%Vor%Beachten Sie, dass in den Beispielen 1 und 2 Methoden auf dem Server aufgerufen werden und daher die Ausgabe des Servers angezeigt wird, der implizit vom Decorator gestartet wurde.
In Beispiel 3 gibt es überhaupt keine Interaktion mit dem Server, daher sehen Sie die Ausgabe des Servers nicht im Protokoll.
Andererseits gibt es in den Beispielen 4 und 5 keine direkte Interaktion mit dem Server-Objekt im Beispiel-Code, aber der Server wird explizit durch einen Vorher-Block gestartet, der auch in der Ausgabe zu sehen ist.