Testmethoden, die mit RSpec in Blöcken verpackt sind

8

In meinem vereinfachten Beispiel von dem, was ich tatsächlich tue, sagen wir, ich habe 2 Aufrufe an die Datenbank:

%Vor%

und ich möchte Mocks für die Datenbankaufrufe verwenden, da die echten Aufrufe an anderer Stelle getestet werden:

%Vor%

das ist alles in Ordnung und schön, aber jetzt, wenn ich die Anrufe in einer Transaktion wickeln, bin ich ein bisschen ratlos:

%Vor%

weil, wenn ich einen Mock schreibe, der transaction empfängt, wird der Aufruf empfangen, aber alles im Block wird nicht aufgerufen, und ich bekomme:

  

erwartet: 1 mal   erhalten: 0 mal

für alle anderen Mocks. Könnte mir jemand zeigen, wie ich meine Spezifikation schreiben sollte, um damit umzugehen? Ich habe versucht, die relevante Seite im RSpec-Buch auf around(:each) zu lesen, aber das war ungefähr so ​​klar wie Schlamm für mich.

Jede Hilfe wird sehr geschätzt.

    
iain 11.05.2011, 02:09
quelle

1 Antwort

12

Sie können #and_yield verwenden, um von einer Erwartungskette zu profitieren:

%Vor%

Sie müssen auch keine doppelten Methoden für Ihre Repo-Klasse einrichten. Zum Beispiel könnte Ihr Setup geschrieben werden:

%Vor%

Sie könnten auch die Verwendung von stub anstelle von should_receive in Erwägung ziehen, da dies keine Erwartungen festlegt:

%Vor%

Im Allgemeinen sollten Sie should_receive nur verwenden, wenn Sie die Interaktion zwischen zwei Objekten testen möchten. Meine persönliche Faustregel ist, dass, wenn es in before erscheint, stub ; Wenn es in einem Beispiel ist, insbesondere mit einem bestimmten Wert, verwenden Sie should_receive .

    
Michael Granger 12.05.2011, 18:49
quelle

Tags und Links