2012-02-10 15 views
6

Sto cercando di ottenere i valori dei cookie nel passaggio Cetriolo:Capybara e cetriolo | Come i biscotti

definizioni Passo

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

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

controller

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

Ma non funziona:

Risultato

expected: not nil 
    got: nil 

interessante, che negli esempi RSpec tutti funziona bene:

controller 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 

Come posso ottenere valori dei cookie in passi di cetriolo utilizzando Capybara?

Grazie.

Debian GNU/Linux 6.0.4;

Ruby 1.9.3;

Ruby on Rails 3.2.1;

Cetriolo 1.1.4;

Cucumber-Rails 1.2.1;

Capybara 1.1.2;

Test in rack 0.6.1.

risposta

8

Definizioni Passo

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 

questo funziona, però, sto ancora cercando un modo meno prolissa. Inoltre, mi piacerebbe sapere come ottenere i dati di sessione in una definizione di passo.

Aggiornato

Per ottenere i dati di sessione si dovrebbe effettuare le seguenti operazioni:

Passo Definizioni

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 

questo è abbastanza verbose troppo.

+0

È possibile estrarlo come metodo personalizzato come spiegato ad esempio in https://github.com/cucumber/cucumber/wiki/Cucumber-Backgrounder#steps-within-steps--an-anti-pattern (verso la fine della sezione). – juanrpozo

2

Ecco il mio codice di passo 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 

Ecco esempio di uscita quando prova non riesce:

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

Sembra che API selenio è cambiato. La soluzione suggerita non ha funzionato, ma dopo aver passato un po 'di tempo a guardarmi intorno, ho trovato una soluzione.

Per salvare un cookie:

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

Per leggere un cookie:

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

cookie_named restituisce un array costituito da "nome" e "valore", quindi abbiamo bisogno di un riferimento in più per estrarre valore del cookie.

Problemi correlati