2012-09-26 15 views
15

Chcę dalej używać tej samej sesji i mam na myśli sesję Railsów pomiędzy różnymi testami integracji Test::Unit, które wykorzystują Capybara. Obiekt Capybara::Session jest taki sam we wszystkich testach, ponieważ jest ponownie wykorzystywany, ale kiedy uzyskuję dostęp do innej strony w innym teście, jestem natychmiast wylogowywany.Jak mogę ponownie wykorzystać sesje Capybara między testami?

Odkopanie Zauważyłem, że capybara_session.driver.browser.manage.all_cookies jest wyczyszczone między jednym testem a następnym.

Jakieś pomysły, jak? lub dlaczego? lub jak tego uniknąć?

Próba obejścia, że ​​uratowałem cookie w zmiennej klasy i ponownie dodane później uruchamiając:

capybara_session.driver.browser.manage.add_cookie(@@cookie) 

i wydaje się działać, plik cookie jest tam, ale gdy pojawia się prośba ciasteczko zostaje zastąpione innym, więc nie przyniosło to efektu.

Czy istnieje inny sposób osiągnięcia tego?

+0

Czy kiedykolwiek rozwiązać ten problem? Uderzam w to i wypróbowałem wszystkie proponowane poniżej rozwiązania, bezskutecznie ... –

Odpowiedz

10

dodać następujący po kodzie kapibary, który współdziała ze strony:

Capybara.current_session.instance_variable_set(:@touched, false) 

or 

page.instance_variable_set(:@touched, false) 

Jeśli to nie zadziała, to może pomóc:

https://github.com/railsware/rack_session_access

http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/

+0

Próbowaliśmy, to nie zadziałało :( – Pablo

+1

Kocham cię, człowieku! :) To działało * świetnie *. Wystąpiły problemy z rspec-steps, dotyczące kontekstu wewnątrz kontekstu (może to być specyficzne dla naszej konfiguracji testu, łatamy kontekst rspec). –

+0

Praca z gemem rack_session_access. Dobra robota ! – Damax

1

You może uniemożliwić wywołanie do @browser.manage.delete_all_cookies, które dzieje się między testami przez łatanie małpy Capybara::Selenium::Driver#reset! metoda. To nie jest czysty sposób to zrobić, ale to powinno działać ...

Dodaj następujący kod do projektu, dzięki czemu jest on wykonywany po Ci require 'capybara':

class Capybara::Selenium::Driver < Capybara::Driver::Base 
    def reset! 
    # Use instance variable directly so we avoid starting the browser just to reset the session 
    if @browser 
     begin 
     #@browser.manage.delete_all_cookies <= cookie deletion is commented out! 
     rescue Selenium::WebDriver::Error::UnhandledError => e 
     # delete_all_cookies fails when we've previously gone 
     # to about:blank, so we rescue this error and do nothing 
     # instead. 
     end 
     @browser.navigate.to('about:blank') 
    end 
    end 
end 

Przez wzgląd zainteresowanie, tym urazę można zobaczyć w bazie kodu Capybara tutaj: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

+0

Ta funkcja nie jest uruchamiana między testami. Właściwie to skomentowałem w moim klejnocie i nie robiło to żadnej różnicy (ustawiłem tam również punkt przerwania i nie został osiągnięty). Myślę, że może działać dla RSpec, gdzie Capybara ma głęboką integrację, ale nie dla Test :: Unit. Właśnie dlatego ten problem jest tak zagadkowy. – Pablo

+0

Interesujący problem! Tak więc 'reset!' Jest wykonywane dla testów rspec tutaj: https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L14 i dla testów ogórków tutaj: https: // github .pl/jnicklas/capybara/blob/master/lib/capybara/cucumber.rb # L10 ... fabuła pogrubia ... Przypuszczam, że już to przeszedłeś: https://github.com/jnicklas/ capybara # using-capybara-with-testunit –

0

Może warto opublikować przyczynę tego rodzaju zachowania. Zazwyczaj posiadanie małpiej łatki Kapibara jest wskazówką, że próbujesz użyć jej do czegoś, do czego nie była przeznaczona. Często możliwe jest zrestrukturyzowanie testów, dzięki czemu pliki cookie nie będą zachowywane w testach integracyjnych.

+6

Aby przyspieszyć testy. Pozostawienie sesji w stanie nienaruszonym (ogólnie) nie stanowi naruszenia izolacji testowej – Phlip

5

Jeśli to, co robisz, próbuje połączyć poszczególne przykłady w opowieść (styl ogórek, ale bez ogórka), możesz użyć klejnotu o nazwie rspec-steps, aby to osiągnąć. Na przykład, zwykle to nie będzie działać:

describe "logging in" do 
    it "when I visit the sign-in page" do 
    visit "/login" 
    end 
    it "and I fill in my registration info and click submit" do 
    fill_in :username, :with => 'Foo' 
    fill_in :password, :with => 'foobar' 
    click_on "Submit" 
    end 
    it "should show a successful login" do 
    page.should have_content("Successfully logged in") 
    end 
end 

Ponieważ rspec wycofuje wszystkie swoje zmienne instancji, sesje, ciastka, itp

Jeśli zainstalujesz rspec-kroki (uwaga: obecnie nie jest zgodny z rspec nowsza niż 2.9), można zastąpić „opisać” z „kroków” i RSpec i kapibary zachowa stan pomiędzy przykładami, dzięki czemu można zbudować dłuższą historię, na przykład:

steps "logging in" do 
    it "when I visit the sign-in page" #... etc. 
    it "and I fill in" # ... etc. 
    it "should show a successful" # ... etc. 
end 
Powiązane problemy