rspec Testassoziation

8

Ich möchte testen, ob ein Mitarbeiter einer Firma in meinen RSPC-Controller-Tests zugeordnet ist.

Ich möchte dies in meiner create -Aktion des Stabskontrolleurs beenden:

%Vor%

Wo current_company von einer Sitzungsvariablen gesammelt wird.

Wie schreibe ich einen Test dafür?

Ich habe diese Modelle

%Vor%

Der folgende Test ist mein Versuch, die Zuordnung zu spezifizieren und schlägt fehl, wenn ich den Assoziationscode eingib:

%Vor%

Wenn ich die 'staff.companies & lt; & lt; current_company 'Code in meinem Controller Ich erhalte diesen Fehler beim Ausführen dieses Tests:

%Vor%

Personal controller create method:

%Vor%     
map7 24.03.2011, 01:05
quelle

4 Antworten

13

Ich würde einen anderen Ansatz verwenden, da das Testen, dass das Modell eine bestimmte Nachricht erhalten soll, Ihre Tests zu eng an die Implementierung koppelt. Interessiert es Sie wirklich, ob Unternehmen #<< oder eine andere Methode erhalten?

Was Sie wirklich testen möchten, ist, ob die Firma des Benutzers aufgezeichnet wird, wenn sie auf die Seite schreibt. Es ist egal wie wie es aufgezeichnet wurde. Also würde ich so etwas tun:

%Vor%

Dies ist das Testen des Verhaltens anstelle der Implementierung. Der Vorteil ist, dass Ihr Test nicht fehlschlägt, wenn jemand << in das äquivalente push ändert. Es hat auch den Vorteil, dass Sie Ihre Absicht besser verstehen und den Code besser dokumentieren.

    
Ian 24.05.2011, 19:38
quelle
2

Wenn Sie in Ihrer Controller-Spezifikation sind, würde ich stub_chain

verwenden %Vor%

welches den Firmenruf UND die & lt; & lt; ANRUFEN und erwarten, dass es einmal aufgerufen wird.

(Mindestens, dass .once sollte mit stub_chain arbeiten ...)

    
RyanWilcox 23.05.2011 03:03
quelle
1

Sie können es testen mit:

%Vor%

Oder wenn die Mitarbeiter bereits andere Unternehmen haben, erhalten Sie die Anzahl und testen Sie, ob Sie (count + 1) .companies haben.

    
Spyros 19.05.2011 02:22
quelle
1

Das Problem mit dem Code besteht darin, dass Sie nach dem Stub-out einer Methode nicht mehr auf dem Modell existieren.

Sie haben die "Firmen" -Methode ausgedruckt (wenn Sie die Erwartung darauf setzen) und jetzt ruft sie nicht mehr die tatsächliche, echte Unternehmensverknüpfung auf dem Modell auf, sondern den von Ihnen erstellten Stub, der zurückkehrt nil (weil Sie keinen Rückgabewert dafür festgelegt haben).

Dann, wenn Sie versuchen, eine Firma in diese neue, Null-Methode mit & lt; & lt; es sagt, dass es das nicht kann.

Um es zu umgehen, können Sie tun, was Sie getan haben, um einen Rückgabewert zu setzen:

%Vor%

, die dann sicherstellen, dass:

%Vor%

wird nicht mit dem schrecklichen Nullfehler fehlschlagen (weil es ein tatsächliches, echtes Array für die Firma gibt).

Aber das Beste, was zu tun ist, ist, wie die vorherigen Leute vorgeschlagen und getestet haben, was Sie tatsächlich wirklich testen müssen - nämlich, dass das Speichern eines Teams mit Firmen dazu führt, dass eine neue Firma in der Datenbank gespeichert wird.

>     
Taryn East 25.05.2011 17:26
quelle

Tags und Links