Testen einer Schienenanwendung, die before_filter :authenticate_user!
für die meisten Controller hat, kann Capybara nicht erhalten, um eine Sitzung zu behalten.Warum verwerfen Capybara meine Sitzung nach einem Ereignis?
Ich habe Capybara mit PhantomJS mit Poltergeist konfiguriert.
Ich verwende den folgenden Helfer:
require 'spec_helper'
include Warden::Test::Helpers
module FeatureHelpers
def login(user = FactoryGirl.create(:default_user))
login_as user, scope: :user
user
end
end
Ich habe folgende Spec-Datei:
require 'spec_helper'
include Warden::Test::Helpers
feature 'Leads Data Tasks View' do
before(:each) do
@user = login
end
after{ Warden.test_reset! }
context "clicking a task button" do
scenario "login persists across multuple actions", js: true do
visit '/tasks'
page.should have_selector('#parse', count: 1)
end
end
end
Wenn ich den Test ausführen, wie es hier gezeigt ist, wird es passieren. Jedoch, wenn ich eine click_link
auf etwas aufrufen, die AJAX-Aktionen durchführt, oder wenn ich einfach visit '/tasks'
zweimal versuchen, wird die should
Assertion fehlschlagen, da ich auf die Anmeldeseite der App weitergeleitet werden.
Ich habe ein paar verschiedene Ansätze versucht, einschließlich der Einrichtung einer Capybara::Session, aber ich bekomme immer noch 401 Codes auf AJAX-Anfragen und ich kann nur einmal pro Spezifikation erfolgreich besuchen.
Was mache ich falsch?
Basierend auf der Syntax Ihre Verwendung Ich denke, das ist ein Gerät. Schießen Sie viele Ajax-Anrufe? Devise hat ein seltsames Verhalten, wenn es um Ajax-Aufrufe geht. Siehe http://stackoverflow.com/questions/11845500/rails-devise-authentication-csrf-issue für weitere Informationen – DickieBoy
Vielen Dank, dass Sie mich auf diese Frage hingewiesen haben. Um deine Frage zu beantworten, feuere ich oft viele AJAX-Anrufe, aber dieses Problem scheint zu passieren, auch wenn ich keine brenne. Wenn ich den "Besuchs" -Ruf so dupliziere, dass er die Seite einfach zweimal lädt, passiert dazwischen kein AJAX. – asfallows
Außerdem habe ich aus Gründen der Tests entschieden, sowohl Option 2 aus der akzeptierten Antwort in Ihrer verknüpften Frage auszuprobieren, als auch vorübergehend "protect_from_forgery" in meinem Anwendungscontroller auszukommentieren. Keine von beiden änderte das Ergebnis; Ich bekomme immer noch 401 auf alle außer der ersten Anfrage. – asfallows