2012-09-26 15 views
15

Quiero seguir usando la misma sesión y me refiero a la sesión de Rails entre varias pruebas de integración Test::Unit que usan Capybara. El objeto Capybara::Session es el mismo en todas las pruebas, ya que se reutiliza, pero cuando accedo a otra página en otra prueba, se cierra la sesión inmediatamente.¿Cómo reutilizo las sesiones de Capybara entre las pruebas?

Cavando Encontré que capybara_session.driver.browser.manage.all_cookies se borra entre una prueba y la siguiente.

¿Alguna idea de cómo? ¿o por qué? o cómo evitarlo?

Tratando de trabajo en torno a eso, me salvaron la cookie en una variable de clase y volver a agregar posteriormente ejecutando:

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

y parece que funciona, la cookie está ahí, pero cuando hay una solicitud , la cookie se reemplaza por otra, por lo que no tuvo ningún efecto.

¿Hay alguna otra forma de lograr esto?

+0

¿alguna vez resolver este problema? Lo estoy golpeando, y he intentado todas las soluciones propuestas a continuación, en vano ... –

Respuesta

10

Agregue el siguiente código después de su capibara que interactúa con la página:

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

or 

page.instance_variable_set(:@touched, false) 

Si eso no funciona, estos podrían ayudar:

https://github.com/railsware/rack_session_access

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

+0

Lo intentamos, no funcionó :( – Pablo

+1

¡Te amo, amigo! :) Esto funcionó * genial *. Me encontré con problemas con rspec-steps, con respecto a un contexto dentro de un contexto (puede ser específico para nuestra configuración de prueba, estamos parcheando el contexto de rspec). –

+0

Trabajó con la gema rack_session_access. Buen trabajo ! – Damax

1

Usted puede evitar la llamada a @browser.manage.delete_all_cookies que ocurre entre las pruebas por el parche mono el Capybara::Selenium::Driver#reset! método. No es una forma limpia de hacerlo, pero debería funcionar ...

Agregue el código siguiente a su proyecto para que se ejecute después que 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 

Por el amor de interés, el línea ofensiva se puede ver en el código base de Capybara aquí: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

+0

Esa función no se ejecuta entre pruebas. De hecho lo comenté en mi gema y no hizo ninguna diferencia (también establecí un punto de quiebre allí y no fue alcanzado). Creo que podría ejecutarse para RSpec, donde Capybara tiene una profunda integración, pero no para Test :: Unit. Es por eso que este problema es tan desconcertante. – Pablo

+0

¡Problema interesante! Así '' reset! 'Se ejecuta para las pruebas de rspec aquí: https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L14 y para las pruebas de pepino aquí: https: // github .com/jnicklas/capybara/blob/master/lib/capybara/cucumber.rb # L10 ... la trama se complica ... Supongo que has pasado por esto: https://github.com/jnicklas/ capybara # using-capybara-with-testunit –

0

Puede valer la pena publicar la razón por la que necesita este tipo de comportamiento. Por lo general, tener la necesidad de parche mono Carpincho, es una indicación de que está tratando de usarlo para algo para lo que no estaba destinado. A menudo es posible reestructurar las pruebas, de modo que no es necesario que las cookies persistan en las pruebas de integración.

+6

Para acelerar las pruebas. Dejar la sesión intacta no es (generalmente) una violación del aislamiento de prueba – Phlip

5

Si lo que estás haciendo es intentar unir ejemplos individuales en una historia (estilo pepino, pero sin pepino), puedes usar una gema llamada rspec-steps para lograr esto. Por ejemplo, normalmente esto no funcionará:

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 

Debido rollos rspec atrás todas sus variables de instancia, sesiones, galletas, etc.

Si instala rspec-pasos (Nota: actualmente no compatibles con rspec más nuevo que 2.9), puede reemplazar 'describir' con 'pasos' y Rspec y capibara preserven el estado entre los ejemplos, que le permite construir una historia más larga, por ejemplo:

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 
Cuestiones relacionadas