Ich versuche zu testen, dass jemand sich auf meiner Seite anmelden kann, indem er eine POST-Anfrage an meine SessionsController
sendet. Ich habe diesen Weg an einigen Stellen empfohlen gesehen:
Aber dieser Test ist nicht korrekt. Der Aufruf von @controller.current_user
versucht, den Benutzer anhand der geposteten Parameter zu authentifizieren und gibt user
zurück, wenn die angegebene E-Mail / das richtige Passwort korrekt ist. Es gibt keine Garantie, dass die Aktion create
tatsächlich sign_in
oder current_user
aufruft.
Auch wenn ich den Test neu schreibe, um zu überprüfen, dass diese Methoden aufgerufen werden, ist es möglich, dass andere Methoden aufgerufen werden können, z. sign_out
.
Gibt es einen definitiveren Weg, um letztendlich zu überprüfen, ob ein Benutzer angemeldet ist und wenn ja, wer der Benutzer ist?
BEARBEITEN -
Zum Beispiel wird der folgende Test bestehen
%Vor%Wenn die SessionsController # create Aktion ist:
%Vor%Lösung mit minimalen Änderungen des vorgeschlagenen Codes in der Frage:
Sie müssen das System initialisieren, bevor der Test beginnt. Versuchen Sie, den folgenden Code vor Ihrem i t 'must be able to sign in a user' do
code voranzustellen:
Dies sollte Ihren Test zu einem gültigen Test für Ihren Post-Controller machen.
Erläuterung:
Ich gehe davon aus, dass Ihr Test oben immer erfolgreich ist, weil der Benutzer bereits angemeldet ist (durch andere Tests, die vor diesem Test ausgeführt wurden). Sie können dies überprüfen, indem Sie byebug
in der Zeile nach it
verwenden und current_user
in bybug's
console ausführen. Wenn es nicht nil
ist, ist der Benutzer bereits angemeldet, wodurch der Test ungültig wird.
Beachten Sie, dass current_user
(anders als in den Kommentaren oben beschrieben) den Status des Benutzers nicht ändert. Es ist eine schreibgeschützte Funktion.
Kürzere / sauberere Lösung:
Meiner Meinung nach gibt es einen saubereren Weg, einen solchen Test wie folgt durchzuführen:
%Vor% Mit der should change from nil to user
-Anweisung vergewissern Sie sich, dass der Benutzer ausgeloggt wurde, bevor der Test beginnt, und dass der Benutzer angemeldet ist, nachdem der Test ausgeführt wurde.
Beachten Sie, dass der Teil
%Vor%entspricht dem (möglicherweise leichter zu verstehenden) Code
%Vor%wie besprochen hier .
Tags und Links ruby ruby-on-rails authentication devise warden