Rails-Test - Prüfung, ob der Benutzer bei Devise angemeldet ist

8

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:

%Vor%

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%     
user1063998 24.08.2016, 11:16
quelle

1 Antwort

2

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:

%Vor%

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 .

    
Olli 08.09.2016 07:59
quelle