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?)
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