2011-02-28 9 views
9

Estoy intentando escribir una prueba para una característica que se basa en algunos datos de sesión almacenado y mi escenario es el siguiente:rieles, pepino, Carpincho: sesión es no persistieron

Scenario: Create offer 
    Given I am on the start offer page 
    When I select "Foo" from "bar" 
    And I press "Go on" 
    Then I should see "You are going to offer foo" 

Al utilizar el depurador I descubrí que la información se almacena en la sesión correctamente, pero en cada nueva solicitud recibo una nueva sesión.

¿No debería haber una sesión de trabajo para al menos cada escenario? ¿Alguna idea de por qué este no es el caso?

Gracias de antemano, Joe

Versiones: 2.3.10 móviles sobre raíles, pepino, pepino 0.10.0-rails 0.3.2, capibara 0.4.1.2

+1

qué controlador usa, ¿ha cambiado alguna configuración de Carpincho? – gertas

+1

¿Puedes publicar las implementaciones de pasos relevantes para este escenario? –

+1

Para responder a su primera pregunta: Sí, debería haber estado de sesión persistente dentro de un escenario. (Y debería funcionar tanto con el controlador Rack :: Test predeterminado como con Selenium). Por qué podría no funcionar para usted, no tengo idea. –

Respuesta

0

Posiblemente this bug?

+0

@Ankur Los puntos en el blog sentían como una respuesta razonable al OP "¿Alguna idea de por qué este no es el caso?", Así que no estoy seguro de por qué piensas que esto no es una respuesta (aunque el enlace solo el punto es válido; en mi defensa, escribí esto hace más de 2.5 años). – nickgrim

+0

Esto fue útil para mí, ya que de hecho mi problema era que Capybara borra la sesión cuando cambia de dominio, aunque estaba navegando desde/some/url a localhost: 8080/some/other –

5

Algunos de los controladores no tienen una forma clara de configurar las cookies. Esta es una solución hacky hasta que se resuelvan:

def set_cookie(name, value, domain) 
    driver = Capybara.current_session.driver rescue nil 

    return unless driver 

    case driver 
    when Capybara::Driver::RackTest 
     driver.set_cookie "#{name}=#{value}" 
    when Capybara::Driver::Selenium 
     visit '/' # must visit the domain before we can set the cookie 

     br = driver.browser.send(:bridge) 

     br.addCookie({ 
     'name' => name, 
     'domain' => domain, 
     'value' => value, 
     'path' => '/', 
     'expires' => (Time.now + 100.years).to_i 
     }) 
    else 
     raise "Unsupported driver #{driver}" 
    end 
    end 
+1

Para que nadie se confunda: los controladores sí manipular las cookies provenientes de la aplicación; me parece que su respuesta es sobre * manualmente * configurar las cookies. (Aunque no estoy seguro de que esto solucione el problema del OP.) –

+0

Tiene razón, sí, esto es útil si desea forzar un inicio de sesión, por ejemplo, si un proceso de inicio de sesión normal sería impulsado por un enfoque openid/oauth eso puede tomar tiempo/requerir una conexión a internet. – raggi

+0

solo quería agregar que su declaración de caso debe ser 'case driver.class', de lo contrario, está buscando un hash masivo –

4

tuvimos el problema con perder la sesión debido a capibara cambiar el nombre de host a mediados de prueba. El escenario era algo como lo siguiente:

# Good 
When I visit some page 
# will call 'http://capybarawhatever/some_page 
And I click the the button 
# will call 'http://capybarawhatever/some_new_page' 
Then I still have the session 

# Failing 
When I visit some page 
# will call 'http://capybarawhatever/some_page' 
And I do something that redirects me to "http://newhost.org/new_page" 
And I visit some page 
# No this may go to 'http://newhost.org/some_page 
Then I have lost my session 

Esto puede valer la pena investigar. Puede obtener el current_url en su sesión, y puede establecer un nuevo host para el carpincho usando host! 'newhost.org'

+0

Voy a investigar en esta dirección. Hay un cambio de contexto involucrado en el paso, aunque la información de sesión solo se almacena y utiliza después del cambio de contexto. – xijo

+0

Parece que la sesión de capibara también puede ser [sensible a las URL relativas] (http://blog.ardes.com/2010/4/28/capybara-and-rack-test-sessions-and-http-methods). – averell

Cuestiones relacionadas