2013-10-11 5 views
16

Я реализую ленивую функцию входа. Моя особенность огурца должна описать:Rails + Cucumber/Capybara: Как установить/получить файлы cookie в тестах?

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 

И это мой шаг определения:

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 

Это то, что происходит, когда пользователь входит в систему: в cookies.signed[:auth_token] получает набор. Это будет использоваться перед фильтром в моем ApplicationController так, чтобы пользователи, которые открывают свежий браузер будут зарегистрированы автоматически:

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 

конца

Это перед фильтром в моем 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 

Итак, проблема заключается в том, что на последнем этапе моей функции огурца cookies.signed[:auth_token] возвращает ноль. Я предполагаю, что это всего лишь капибара. Так я действительно должен установить cookie в тесте, а не использовать тот, что есть в моем контроллере?

ответ

20

Так что, в конце концов, я понял это, попробовав много разных вещей.

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 

UPDATE:

Вот что я использую в случае, если я использую Selenium для некоторых из тестов:

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 
+2

undefined method 'set_cookie 'для # Nakilon

+0

Вместо' Capybara.current_session.driver.request.cookies. [] (' Auth_token ') ', почему бы не использовать стандартный сахар Ruby для хэшей - т.е. 'Capybara.current_session.driver.request.cookies ['auth_token']' – Arepo

+1

Для драйвера Poltergeist метод (как описано на [странице Poltergeist GitHub] (https://github.com/teampoltergeist/poltergeist)), является 'page.driver.set_cookie()', а его 3 аргумента - имя файла cookie, его значение и хэш параметров для установки, помимо прочего, значения срока действия cookie. – sameers

7

Использование https://github.com/nruth/show_me_the_cookies, который оборачивает методы драйвера. Он имеет методы для получения файлов cookie, удаления файлов cookie и нового метода create_cookie, который еще не задокументирован в README.

Смежные вопросы