Rails + Pepino/el Chigüire: Cómo establecer/recuperar cookies en las pruebas?

Estoy implementando un perezoso función de inicio de sesión. Mi pepino característica debe describir:

    Feature: User log in

        Scenario: Lazy login
            Given I didn't log out the last time I was on the site
            When I go to the homepage
            Then I should automatically be logged in 

Y estos son mi paso definiciones:

Given(/^I didn't log out the last time I was on the site$/) do
  user = FactoryGirl.create(:user)
  visit new_user_session_path
  fill_in('user[email]', with: user.email)
  fill_in('user[password]', with: 'test123')
  click_button('Sign in')

  Capybara.reset_sessions!
end

When(/^I go to the homepage$/) do
  visit root_path
end

Then(/^I should automatically be logged in$/) do #<-- Fails here
  page.should have_content("Logout")
end

Esto es lo que sucede cuando un usuario inicia sesión en: la cookies.signed[:auth_token] se establece. Esto será utilizado por un filtro antes de en mi controlador de aplicación para que los usuarios que abrir una ventana nueva del navegador se registrará automáticamente:

class SessionsController < Devise::SessionsController

def create
  super
  if user_signed_in?
    puts 'yesssssss'
    session[:user_id] = current_user.id  
    current_user.remember_me! if current_user.remember_token.blank?
    cookies.signed[:auth_token] = {
      :value => current_user.remember_token,
      :domain => "mysite.com",
      :secure => !(Rails.env.test? || Rails.env.development?)
      }
    puts "current_user.remember_token = #{current_user.remember_token}"
    puts 'cookies:'
    puts cookies.signed[:auth_token]
  end
end

final

Este es el antes de filtrar en mi ApplicationController:

def sign_in_through_cookie
  logger.info "logging in by cookie"
  puts "logging in by cookie"
  puts cookies.signed[:auth_token] #<-- PROBLEM: this returns nil.
  return true if !current_user.nil?
  if !cookies[:auth_token].nil? && cookies[:auth_token] != ''
    user = User.find_by_remember_token(cookies.signed[:auth_token])
    return false if user.blank?
    sign_in(user)
    puts 'success'
    return true
  else
    return false
  end
end

Así que el problema es que en el último paso de mi pepino característica, cookies.signed[:auth_token] devuelve nil. Supongo que esto es sólo un carpincho cosa. Así que lo que en realidad tiene que establecer una cookie en la prueba, en lugar de utilizar uno en mi controlador?

InformationsquelleAutor bigpotato | 2013-10-11

2 Kommentare

  1. 22

    Por lo que finalmente he descubierto después de probar un montón de cosas diferentes.

    Given(/^I didn't log out the last time I was on the site$/) do
      user = FactoryGirl.create(:user)
      visit new_user_session_path
      fill_in('user[email]', with: user.email)
      fill_in('user[password]', with: 'test123')
      click_button('Sign in')
    
      Capybara.current_session.driver.request.cookies.[]('auth_token').should_not be_nil
      auth_token_value = Capybara.current_session.driver.request.cookies.[]('auth_token')
      Capybara.reset_sessions!
      page.driver.browser.set_cookie("auth_token=#{auth_token_value}")
    end
    
    When(/^I go to the homepage$/) do
      visit root_path
    end
    
    Then(/^I should automatically be logged in$/) do
      page.should have_content("Logout")
    end

    ACTUALIZACIÓN:

    Aquí es lo que yo uso en caso estoy usando el Selenio para algunas de las pruebas:

    if Capybara.current_session.driver.class == Capybara::Selenium::Driver
      auth_token = page.driver.browser.manage.cookie_named('auth_token')[:value]
      page.driver.browser.manage.delete_all_cookies
      page.driver.browser.manage.add_cookie(:name => "auth_token", :value => auth_token)
    else
      puts "cookies = #{Capybara.current_session.driver.request.cookies}"
      Capybara.current_session.driver.request.cookies.[]('auth_token').should_not be_nil
      auth_token_value = Capybara.current_session.driver.request.cookies.[]('auth_token')
      Capybara.reset_sessions!
      page.driver.browser.set_cookie("auth_token=#{auth_token_value}")
    end
    • undefined method `set_cookie’ para #<Selenio::WebDriver::Controlador
    • En lugar de Capybara.current_session.driver.request.cookies.[]('auth_token'), ¿por qué no usar Ruby estándar de azúcar para el hash – es decir Capybara.current_session.driver.request.cookies['auth_token']
    • Para el Poltergeist del controlador, el método (como se documenta en la el Poltergeist página de GitHub) es page.driver.set_cookie(), y sus 3 argumentos son el nombre de la cookie, su valor, y una de las opciones de hash para establecer, entre otras cosas, la cookie del valor de caducidad.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein