2012-02-10 12 views
6

Estoy tratando de obtener los valores de cookie en el paso Pepino:Capybara & Cucumber | Obtención de las galletas

definiciones Paso

When /^I log in$/ do 
    # code to log in 
end 

Then /^cookies should be set$/ do 
    cookies[:author].should_not be_nil 
end 

controlador

class SessionsController < ApplicationController 
    def create 
    cookies[:author] = 'me' 
    redirect_to authors_path 
    end 
end 

Pero no funciona:

Resultado

expected: not nil 
    got: nil 

interesante, que en los ejemplos RSpec todos funciona bien:

controlador Spec

require 'spec_helper' 

describe SessionsController do 
    describe 'create' do 
    it 'sets cookies' do 
     post :create 
     cookies[:author].should_not be_nil 
    end 
    end 
end 

¿Cómo puedo obtener los valores de cookie en los pasos de pepino utilizando Carpincho?

Gracias.

Debian GNU/Linux 6.0.4;

Ruby 1.9.3;

Ruby on Rails 3.2.1;

Pepino 1.1.4;

Cucumber-Rails 1.2.1;

Capybara 1.1.2;

Rack-Test 0.6.1.

Respuesta

8

Definiciones Paso

Then /^cookies should be set^/ do 
    Capybara 
    .current_session # Capybara::Session 
    .driver   # Capybara::RackTest::Driver 
    .request   # Rack::Request 
    .cookies   # { "author" => "me" } 
    .[]('author').should_not be_nil 
end 

esto funciona, sin embargo, todavía estoy buscando una manera menos detallado. Además, me gustaría saber cómo obtener los datos de la sesión en una definición de paso.

Actualizado

Para obtener los datos de sesión se debe hacer lo siguiente:

Definiciones Paso

Then /^session data should be set$/ do 
    cookies = Capybara 
    .current_session 
    .driver 
    .request 
    .cookies 

    session_key = Rails 
    .application 
    .config 
    .session_options 
    .fetch(:key) 

    session_data = Marshal.load(Base64.decode64(cookies.fetch(session_key))) 

    session_data['author'].should_not be_nil 
end 

Esto es bastante detallado también.

+0

Puede extraerlo como un método personalizado como se explica, por ejemplo, en https://github.com/cucumber/cucumber/wiki/Cucumber-Backgrounder#steps-within-steps--an-anti-pattern (hacia el final de la sección). – juanrpozo

2

Aquí está mi código de paso Defenition:

Then /^cookie "([^\"]*)" should be like "([^\"]*)"$/ do |cookie, value| 
    cookie_value = Capybara.current_session.driver.request.cookies.[](cookie) 
    if cookie_value.respond_to? :should 
    cookie_value.should =~ /#{value}/ 
    else 
    assert cookie_value =~ /#{value}/ 
    end 
end 

Aquí es ejemplo de salida cuando no supera la prueba:

expected: /change/ 
    got: "/edit" (using =~) 
Diff: 
@@ -1,2 +1,2 @@ 
-/change/ 
+"/edit" 
(RSpec::Expectations::ExpectationNotMetError) 
./features/step_definitions/web_steps.rb:244:in `/^cookie "([^\"]*)" should be like "([^\"]*)"$/' 
features/auth.feature:57:in `And cookie "go" should be like "change"' 
5

Parece que la API de selenio ha cambiado. La solución sugerida no funcionó, pero después de pasar un poco de tiempo mirando alrededor, encontré una solución.

Para guardar una cookie:

browser = Capybara.current_session.driver.browser.manage 
browser.add_cookie :name => key, :value => val 

Para leer una cookie:

browser = Capybara.current_session.driver.browser.manage 
browser.cookie_named(key)[:value] 

cookie_named devuelve una matriz que consiste en "nombre" y "valor", por lo que necesitamos una referencia adicional para extraer valor de cookie

Cuestiones relacionadas