2012-06-22 14 views
7

Ich habe eine Ressource, wo die neue Aktion erfordert, dass ein Benutzer zum Anzeigen angemeldet ist. Wenn ein Benutzer versucht, eine neue Ressource zu erstellen, ohne angemeldet zu sein, wird er auf die Anmeldeseite umgeleitet (302). Mein Funktionstest wie folgt aussieht:Devise warden Fehler für authenticate_user in funktionalen Rails-Test ausgelöst

test "should not get new unless logged in" do 
    get :new 
    assert_response :redirect 
    end 

Der Stacktrace sieht ungefähr so ​​aus:

ArgumentError: uncaught throw :warden 
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw' 
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!' 
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!' 

Ich habe einen before_filter vor der neuen Aktion authenticate_user.

Ich verstehe, warum authenticate_user! scheitert, aber ich kann nicht verstehen, warum es einen Fehler wirft. Sollte es sich nicht einfach so verhalten wie in der Webapp, also. Leitet Benutzer auf die Anmeldeseite um?

Danke.

+0

Haben Sie jemals einen Weg gefunden, einen Fall zu testen, in dem der Benutzer nicht angemeldet ist? Ich habe ein ähnliches Problem. –

+1

Ich bin mir nicht sicher, wie ich das schließlich funktionierte, aber es könnte daran liegen, dass ich "include Devise :: TestHelpers" zur Testklasse hinzufüge.Fühlen Sie sich frei, einen Pastebin mit Ihrem Code hinzuzufügen, und ich werde versuchen, einen Blick darauf zu werfen. – Ger

+0

in meinem Fall erwies sich dies als 'js: true' in der Feature-Deklaration (die ich nicht brauchte und irgendwie diesen Fehler verursachte) – xxjjnn

Antwort

0

Ich weiß, dass dies eine alte Frage ist jetzt, aber ich fand die Antwort der Devise Wiki

https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara

Dieser eine Schritt für Schritt-Anleitung hat, die zu involde ist hier neu zu erstellen, jedoch die erste Schritt ist die Warden Test Helfer

include Warden::Test::Helpers 
Warden.test_mode! 

Hoffnung zu schließen, das hilft

+1

Das passierte mir, als ich extra Logik in einen Benutzer eingebunden hatte (sie brauchten von einem Admin genehmigt zu werden, der nicht auf meinem Devise-Problem-Radar aufkam). Stellen Sie daher, selbst wenn ein Benutzer gültig ist, sicher, dass er über die richtigen Flags/Berechtigungen verfügt, um die Seite anzeigen zu können. – Danny

+0

Siehe meine Antwort oben. Sie möchten auch Warden.test_reset hinzufügen! in Ihrer Teardown-Funktion, um Änderungen am Ende Ihrer Tests rückgängig zu machen. Andernfalls werden alle Warden-Aktionen, die in einem Testfall (z. B. beim Einloggen) ausgeführt werden, in den nächsten übertragen. – xeorem

2

Dies geschieht, wenn der Wärter und/oder Dev Einschlüsse fehlen oder werden nicht an der richtigen Stelle hinzugefügt. Es ist verlockend, sie zu test_helper.rb hinzuzufügen, da hier normalerweise Helfer losgehen, die aber für Devise nicht richtig funktionieren.

Weitere Informationen finden Sie unter https://github.com/plataformatec/devise/issues/1029.

Um dieses Problem zu lösen, umfassen sowohl die Devise Helfer und der Warden Helfer in Testklasse des Controllers wie folgt aus:

require 'test_helper'         
class UserControllerTest < ActionController::TestCase 
    include Devise::TestHelpers       
    include Warden::Test::Helpers       
    Warden.test_mode!          

    def teardown           
    Warden.test_reset!         
    end             

    # test "the truth" do        
    # assert true 
    # end 
end 

Diese für jeden Controller erforderlich ist, die Devise der Authentifizierung verwendet.

BEARBEITEN: Wie in den Kommentaren unten erwähnt, funktioniert die Verschiebung include Warden:TestHelpers von spec_helper.rb (oder test_helper.rb) zu rails_helper.rb auch.

+3

Sie müssen die Helfer nicht in jede Klasse aufnehmen. Sie können Ihrem test_helper einfach folgendes hinzufügen: 'class ActionController :: TestCase include Devise :: TestHelpers include Warden :: Test :: Helfer end '(Entschuldigung wegen fehlender Leerzeichen) – sbleon

+1

Ihre" Antwort "nicht überhaupt arbeiten. Entschuldigung, aber das ist wirklich keine angemessene Antwort, um all das Durcheinander in Ihrem Controller zu berücksichtigen. – wegginho

+2

Ich hatte dieses Problem aus diesem Grund, und das Verschieben 'config.include Devise :: TestHelpers' von' spec_helper.rb' nach 'rails_helper.rb' löste es (indem das Modul später in die Kette aufgenommen wurde). –

1

Ich habe diesen Fehler, aber es war, weil ich meine include Devise::TestHelpers außerhalb meiner Klassendefinition legte.

require 'test_helper' 
include Devise::TestHelpers 

class Admin::ObservationsControllerTest < ActionController::TestCase 
    setup do 
    ... 

Das warf den Warden-Fehler für 3 meiner 7 Testfälle. Verschieben Sie die include innerhalb der Klassendefinition alles behoben.

Verwandte Themen