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.
Sie können #and_yield
verwenden, um von einer Erwartungskette zu profitieren:
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:
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
.