2013-09-04 9 views
16

Testowanie aplikacji szyny, która ma before_filter :authenticate_user! dla większości kontrolerów, nie mogę nakłonić Capybary do zachowania sesji.Dlaczego Capybara odrzuca moją sesję po jednym wydarzeniu?

Mam Capybara skonfigurowany przy użyciu PhantomJS z poltergeist.

używam następujące pomocnika:

require 'spec_helper' 
include Warden::Test::Helpers 

module FeatureHelpers 
    def login(user = FactoryGirl.create(:default_user)) 
    login_as user, scope: :user 
    user 
    end 
end 

Mam następujący file spec:

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 

Kiedy uruchamiam test jak to pokazano tutaj, to minie. Jeśli jednak wezwę element click_link do wykonania akcji AJAX lub po prostu spróbuję dwukrotnie wykonać visit '/tasks', asercja zakończy się niepowodzeniem, ponieważ zostanie przekierowany na stronę logowania do aplikacji.

Próbowałem już kilku różnych podejść, w tym konfigurowania Capybara::Session, ale nadal otrzymuję kody 401 na żądania AJAX i mogę odwiedzać je tylko raz na każdą specyfikację.

Co robię źle?

+0

podstawie składni używasz , Domyślam się, że to wymyśl. Czy uruchamiasz wiele wywołań ajaxowych? Devise ma dziwne zachowanie podczas obsługi wywołań ajaxowych. Zobacz http://stackoverflow.com/questions/11845500/rails-devise-authentication-csrf-issue, aby uzyskać więcej informacji. – DickieBoy

+0

Dziękuję za skierowanie mnie do tego pytania. Aby odpowiedzieć na twoje pytanie, często odpalam wiele wywołań AJAX, jednak wydaje mi się, że ten problem występuje, nawet jeśli nie wystrzelę. Jeśli powielę wywołanie 'visit', aby po prostu załadować stronę dwukrotnie, nie ma AJAX pomiędzy. – asfallows

+0

Dodatkowo, dla celów testowania, zdecydowałem się wypróbować obie opcje 2 od zaakceptowanej odpowiedzi w połączonym pytaniu, a także tymczasowo skomentowałem 'protect_from_forgery' w moim kontrolerze aplikacji. Żadna z nich nie zmieniła wyniku; Nadal mam 401 we wszystkich oprócz pierwszej prośby. – asfallows

Odpowiedz

22

Problem polegał na tym, że sterownik phantomjs (poltergeist) korzystał z oddzielnego połączenia z bazą danych. Miałem dokładnie ten sam problem przed i mam rozwiązanie z railscast episode 391 z kodem w spec/support/shared_db_connection.rb

Ponieważ nie mogę znaleźć licencję na jego kod tak będę tylko odwołuje się do code here

+3

Podejrzewam, że korzystasz z gem DatabaseCleaner i powinieneś powiedzieć mu, aby używał: strategii obcięcia jawnie dla testów kapibara. Również 'self.use_transactional_fixtures = false'. W ten sposób nie musisz udostępniać połączenia. – Fedcomp

Powiązane problemy