Ich prüfe, ob eine erfolgreiche Anmeldung erfolgt oder nicht. Dafür überprüfe ich,
Dafür sieht mein controller
so aus
Und mein test
sieht so aus
Obwohl dies im Browser funktioniert. Aber während des Tests schlägt es mit der folgenden Meldung fehl:
BadMethodCallException: Methode Mothelery_0_Illuminate_Auth_AuthManager :: check () existiert nicht für dieses Mock-Objekt
Sie haben die Definition Ihrer Route nicht angezeigt, aber ich nehme an, dass Ihre login
Route durch den guest
before Filter geschützt ist. Dieser Filter verwendet Auth::check()
, bevor er an die Route gesendet wird.
Wenn Sie in Ihrem Test Auth::shouldReceive()
aufrufen, wird der Auth
-Fassadenpunkt auf eine mockige Instanz gesetzt. Da Sie für die Methode check()
keine Erwartung für die mocked-Instanz definiert haben, erhalten Sie einen Fehler.
Die einfachste Lösung wäre, die Auth::check()
-Methode ebenfalls vorzuspielen und false
zurückzugeben (um zu emulieren, dass die Route besucht wird, während sie nicht eingeloggt ist).
Sie könnten auch einen zweiten Test mit Auth::check()
mocked schreiben, um true
zurückzugeben, um zu testen, was passiert, wenn Sie Ihre Login-Route besuchen, während Sie bereits eingeloggt sind.
Meiner Meinung nach ist dies ein Funktionstest, kein Unit-Test. Es ist absolut nicht nötig, dass Sie sich über Klassen lustig machen. Sie müssen dafür einen Funktionstest schreiben.
Wenn ich es tun müsste, würde ich so etwas tun:
http://localhost/home
Ihr Testcode in Laravel 4.2 wird also etwa so aussehen:
%Vor%Vielleicht stackoverflow thread könnte helfen.
Als Nebenbemerkung: Ich stimme @Raza Mehdi zu.
Ich denke, das Testen der Anmeldefunktion von einer höheren Ebene, testet unseren tatsächlichen Code, anstatt das Auth
-Objekt (ein Typ, den wir nicht besitzen) auszuspionieren.
Im Code:
%Vor%Tags und Links unit-testing php laravel-4 laravel