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:
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% 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.
Wenn Sie in Ihrer Controller-Spezifikation sind, würde ich stub_chain
welches den Firmenruf UND die & lt; & lt; ANRUFEN und erwarten, dass es einmal aufgerufen wird.
(Mindestens, dass .once
sollte mit stub_chain arbeiten ...)
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.
>Tags und Links ruby-on-rails-3 rspec2