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