2013-09-04 7 views
16

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?

+0

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

+0

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

+0

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

Antwort

22

Das Problem war also, dass phantomjs Treiber (poltergeist) eine getrennte Datenbankverbindung verwendete. Ich hatte genau das gleiche Problem vor und ich bekam eine Lösung von railscast episode 391 mit dem Code in spec/support/shared_db_connection.rb

Da ich nicht Lizenz für seinen Code finden, damit ich verlinkt nur auf die code here

+3

Ich vermute, Sie verwenden DatabaseCleaner Gem, und Sie sollten es sagen zu verwenden: Trunkierungsstrategie explizit für Capybara-Tests. Auch 'self.use_transactional_fixtures = false'. Auf diese Weise müssen Sie die Verbindung nicht teilen. – Fedcomp