2013-10-28 4 views
8
angemeldet

Dies ist eine Spezifikation für eine sehr typische Steuerung mit einem before_filter, die zum Login-Seite umgeleitet, wenn ein nicht-angemeldeten Benutzer (auch bekannt als ein Gast) versucht Zugriff auf /projects/new.„abgefangene Wurf: warden“, wenn Tests für Benutzer umleitet nicht in

describe ProjectsController do 
    (...) 

    describe "GET new" do 
    context 'when not logged in' do 
     before { sign_in_nobody } 

     context 'creating project' do 
     before { get :new } 

     it 'denies access' do 
      expect(response).to be_redirect 
     end 
     end 
    end 
    end 
end 

Ich habe alle möglichen Ergebnisse specced des Zugriffs auf :index, :show und :new für Gäste, Benutzer, admins und superadmins. Ich hatte keine Probleme, weder mit eingeloggten oder Gastbenutzern, Admins oder nicht, aber das ist das erste Mal, dass diese Spezifikation eine Handlung berührt, die Devices before_filter :autheticate_user! beinhaltet und es kläglich schief geht.

Wie Sie vielleicht schon vermuten - die Spezifikation auch expect(response).to be_redirect nicht erreicht, wirft es einen hissy vor:

Failures: 

1) ProjectsController GET new when not logged in creating project denies access 
    Failure/Error: get :new 
    ArgumentError: 
    uncaught throw :warden 
    # ./spec/controllers/projects_controller_spec.rb:344:in `block (5 levels) in <top (required)>' 

ich nach einer Antwort auf Frage gesucht haben: „, wie man richtig für authentifizierte testen (Gast) Benutzer mit rspec und devise ", aber jeder spricht nur über Probleme mit der Anmeldung von Benutzern in der Entwicklung für RSpec zu verwenden. Ein Problem, das ich thusly gelöst:

#spec/support/devise_authenticators.rb 
include Devise::TestHelpers 

def sign_in_nobody 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in User.new 
end 

def sign_in_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in FactoryGirl.create(:user) 
end 

aber es ist nicht die Protokollierung in dem fehlschlägt hier, es ist die „nicht protokolliert wird“. Bisher habe ich absolut nichts und ich kenne Leute HABEN, um diese Szenarien irgendwie zu testen.

Im Moment bin ich mit einem Walkaround:

before { sign_in_nobody } 

context 'creating project' do 
    it 'denies access' do 
    expect{ get :new }.to raise_exception("uncaught throw :warden") 
    end 
end 

Aber auch tho es ist praktisch korrekt (uncaught throw :warden geschieht nur, wenn authenticate_user! nicht so kann es als Erwartung verwendet werden) in der Theorie fühlt es sich wirklich schmutzig.

Irgendwelche Ideen, wie man es richtig macht?

(... Vielleicht sollte ich nicht alles testen, da, wie die Richtigkeit der before_filter authenticate_user! ist die Verantwortung Devise nicht von mir?)

+0

Dies ist ein Duplikat [SO11152671] ist (http://stackoverflow.com/questions/11152671/devise-warden-error-thrown -für-authentifizieren-Benutzer-in-Funktions-Schienen-Test # antwort-20725510). Ich habe dort eine vollständige Antwort eingefügt. Kurz gesagt, müssen Sie in der aktuellen ControllerTest-Klasse und nicht in test_helper.rb Include-Komponenten für den Devise-Test-Helper und den Warden-Test-Helper hinzufügen. – xeorem

Antwort

4

Es sollte gerade arbeiten. Ich habe gerade eine Weile damit verbracht, das gleiche Problem zu beheben, und es stellte sich heraus, dass wir einen Testhelfer 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, was ich spreche, wenn ich sage, wir process overrode finden this answer die beschreibt, wie Standard Parameter einstellen schließen format: json

+0

Ich habe den gleichen Fehler, aber ich verstehe nicht, wo ich 'include Devise :: TestHelpers' einfügen soll. Kannst du mir helfen? Danke – Rowandish

+0

Du kannst es in deiner Testklasse oder im Helfer für alle Controller machen. Siehe zum Beispiel die oberen 2 Überschriften unter https://github.com/plataformatec/devise/wiki/How-To:-Controllers-tests-with-Rails-3-(and-rspec) für Test :: Unit und RSpec . –

+1

Danke! Ich hatte dieses Problem, bei dem der Fehler "uncaught throw: warden" ausgelöst wurde, obwohl wir die richtigen Testhelfer hatten. Es stellte sich heraus, dass wir einen "default_params" -Helfer hatten, genau wie den, mit dem Sie verbunden waren, der das Problem verursacht hat. – Percy

1

So ist die Lehre, dass uncaught throw :warden passiert, wenn authenticate_user! ausfällt.

Also herauszufinden, warum Ihre Benutzer-Authentifizierung ist ein Fehler, und Sie haben Ihr Problem gelöst.

1

Ich hatte ein ähnliches Problem und löste ich es wie folgt aus:

e = catch(:warden) { get root_url } 
expect(e[:message]).to be(:not_activated) 
Verwandte Themen