2012-09-26 2 views
15

Ich möchte die gleiche Sitzung und damit meine ich Rails Sitzung zwischen verschiedenen Test::Unit Integrationstests, die Capybara verwenden. Das Objekt Capybara::Session ist in allen Tests dasselbe, da es wieder verwendet wird, aber wenn ich in einem anderen Test auf eine andere Seite zugreife, werde ich sofort ausgeloggt.Wie kann ich Capybara-Sitzungen zwischen den Tests erneut verwenden?

Digging in Ich fand, dass capybara_session.driver.browser.manage.all_cookies zwischen einem Test und dem nächsten gelöscht wird.

Irgendwelche Ideen wie? oder warum? oder wie man es vermeidet?

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

und es scheint zu funktionieren, das Cookie ist da, aber wenn es eine Anfrage: später durch Ausführen

, dass die Arbeit-around Der Versuch, sparte ich das Cookie in einer Klassenvariablen und wieder hinzugefügt , der Cookie wird durch einen anderen ersetzt, also hatte er keine Wirkung.

Gibt es einen anderen Weg, dies zu erreichen?

+0

Haben Sie jemals dieses Problem lösen? Ich treffe es und habe alle unten vorgeschlagenen Lösungen vergeblich versucht ... –

Antwort

10

Fügen Sie folgende nach dem Capybara-Code, der mit der Seite interagiert:

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

or 

page.instance_variable_set(:@touched, false) 

Wenn das nicht funktioniert, könnte dies helfen:

https://github.com/railsware/rack_session_access

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

+0

Wir haben es versucht, es hat nicht funktioniert :( – Pablo

+1

Ich liebe dich, Mann! :) Das hat funktioniert * super *. Ich stieß auf Probleme mit rspec-Schritten in Bezug auf einen Kontext innerhalb eines Kontextes (möglicherweise spezifisch für unser Test-Setup; wir patchen den Kontext von rspec). –

+0

Arbeitete mit dem Edelstein rack_session_access. Gute Arbeit ! – Damax

1

Sie kann den Anruf zu @browser.manage.delete_all_cookies verhindern, der zwischen Tests geschieht, indem er denAffen patchtMethode. Es ist nicht eine saubere Art und Weise, es zu tun, aber es sollte funktionieren ...

den folgenden Code zu Ihrem Projekt hinzufügen, so dass es ausgeführt wird, nachdem Sie 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 

Für Interesse willen, die Straffällige Linie kann in Capebaras Codebasis hier gesehen werden: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

+0

Diese Funktion wird nicht zwischen den Tests ausgeführt. Ich habe es in meinem Juwel wirklich kommentiert und es machte keinen Unterschied (ich habe dort auch einen Haltepunkt gesetzt und es wurde nicht erreicht). Ich denke, es könnte für RSpec laufen, wo Capybara eine tiefe Integration hat, aber nicht für Test :: Unit. Deshalb ist dieses Problem so rätselhaft. – Pablo

+0

Interessantes Problem! Also 'reset!' Wird für rspec Tests hier ausgeführt: https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L14 und für Gurken-Tests hier: https: // github .com/jnicklas/capybara/blob/master/lib/capybara/gurke.rb # L10 ... die Handlung verdickt sich ... Ich nehme an, du hast das durchgemacht: https://github.com/jnicklas/ capybara # using-capybara-mit-testunit –

0

Es kann sich lohnen, den Grund zu veröffentlichen, warum Sie diese Art von Verhalten benötigen. In der Regel, wenn Sie Capybara affen müssen, ist das ein Hinweis darauf, dass Sie es für etwas verwenden, für das es nicht vorgesehen war. Es ist oft möglich, die Tests neu zu strukturieren, so dass die Cookies nicht über Integrationstests hinweg bestehen bleiben müssen.

+6

Um die Tests zu beschleunigen. Das Verlassen der Sitzung ist (im Allgemeinen) keine Verletzung der Testisolierung – Phlip

5

Wenn Sie versuchen, einzelne Beispiele zu einer Geschichte zusammenzufassen (Gurkenstil, aber ohne Gurke), können Sie einen Edelstein namens rspec-steps verwenden, um dies zu erreichen. Zum Beispiel wird in der Regel nicht funktionieren:

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 

Da rspec rollt wieder alle seine Instanzvariablen, Sitzungen, Cookies, usw.

Wenn Sie rspec Schritte (Anmerkung installieren: zur Zeit nicht kompatibel mit rspec neuer als 2.9), können Sie ‚beschreiben‘ mit ‚Schritte‘ ersetzen und Rspec und capybara wird Zustand zwischen den Beispielen erhalten, so dass Sie eine längere Geschichte zu bauen, zum Beispiel:

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