"uncaught throw: warden" beim Testen von Weiterleitungen für nicht eingeloggte Benutzer

8

Dies ist eine Spezifikation für einen sehr typischen Controller mit before_filter , der zur Anmeldeseite umleitet, wenn ein nicht eingeloggter Benutzer (aka Gast ) versucht, auf /projects/new . %Vor%

Ich habe alle möglichen Ergebnisse des Zugriffs auf :index , :show und :new für Gäste , Benutzer , Admins und Superadmins . Ich hatte keine Probleme, weder angemeldete Benutzer noch Gastbenutzer, Admins oder nicht, zu benutzen - aber dies ist das erste Mal, dass diese Spezifikation eine Aktion berührt, die Devices before_filter :autheticate_user! betrifft und es kläglich scheitert.

Wie Sie vielleicht bereits vermuten, erreicht die Spezifikation nicht einmal expect(response).to be_redirect , sondern wirft einen Wutanfall vor:

%Vor%

Ich habe nach einer Antwort auf die Frage gesucht: "Wie man mit" rspec and devise "auf nicht authentifizierte ( guest ) Benutzer richtig testet, aber alle reden nur davon, Probleme mit der tatsächlichen Anmeldung von Benutzern im Gerät zu haben für RSpec zu verwenden. Ein Problem, das ich so gelöst habe:

%Vor%

Es ist jedoch nicht die Anmeldung, die hier fehlschlägt, es ist das "nicht protokolliert". Bis jetzt habe ich absolut nichts und ich kenne Leute HABEN diese Szenarien irgendwie zu testen.

Im Moment benutze ich einen Walkaround:

%Vor%

Aber auch wenn es praktisch korrekt ist ( uncaught throw :warden passiert nur, wenn authenticate_user! ausfällt, so dass es als Erwartung verwendet werden kann). In der Theorie fühlt es sich sehr dreckig an.

Irgendwelche Ideen wie man es richtig macht?

(... Vielleicht sollte ich das überhaupt nicht testen, da die Richtigkeit von before_filter authenticate_user! die Verantwortung von Devise ist, nicht meine?)

    
ellmo 28.10.2013, 01:03
quelle

3 Antworten

4

Es sollte einfach funktionieren. Ich habe gerade eine Weile damit verbracht, das gleiche Problem zu beheben, und es stellte sich heraus, dass wir einen Test-Helper hatten, der process für Controller-Tests überschreibt. Devise überschreibt es auch auf catch :warden , also brauchte ich nur include Devise::TestHelpers , bevor ich das Standardparametermodul einfügte.

Für ein Beispiel von dem, worüber ich spreche, wenn ich sage, dass wir process überschrieben haben, siehe diese Antwort , die beschreibt, wie Standardparameter so eingestellt werden, dass format: json

eingeschlossen wird     
Sammy Larbi 05.11.2013 20:46
quelle
1

Die Lektion ist also, dass uncaught throw :warden passiert, wenn authenticate_user! fehlschlägt.

Finden Sie heraus, warum Ihre Benutzerauthentifizierung fehlgeschlagen ist, und Sie haben Ihr Problem gelöst.

    
Pieter van der Merwe 23.02.2016 13:14
quelle
1

Ich hatte ein ähnliches Problem und habe es so gelöst:

%Vor%     
Sarah Neuber 06.02.2017 12:41
quelle

Tags und Links