2013-10-11 22 views
16

Tembel giriş özelliği uyguluyorum.Raylar + Salatalık/Capibara: Testlerde çerezler nasıl ayarlanır/alınır?

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 

Ve bunlar benim adım tanımları şunlardır: My salatalık özelliği onu açıklamalıdır cookies.signed[:auth_token] set alır:

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 

Bu bir kullanıcı günlükleri böyle olur işte. Taze tarayıcı açın kullanıcılar otomatik giriş böylece Bu benim ApplicationController süzgeçten önce bir tarafından kullanılacaktır:

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 

Bu benim ApplicationController filtre öncedir:

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 

Sorun şu ki, salatalık özelliğimin son adımında cookies.signed[:auth_token] nil döndürüyor. Sanırım bu sadece bir capibara şey. Bu yüzden, kontrol cihazımda bir tanesini kullanmanın aksine, testte bir çerez belirlemem gerekiyor mu?

cevap

20

Sonunda çok farklı şeyler denedikten sonra anladım.

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 

GÜNCELLEME:

İşte ben testlerin bazıları için selenyum kullanıyorum durumunda kullanılacak ne: Sürücü yöntemlerini sarar

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" için # Nakilon

+0

"Capybara.current_session.driver.request.cookies. [] ('Auth_token')' yerine, neden Ruby'nin standart şekerini hashlar için kullanmayın - Örneğin, Capybara.current_session.driver.request.cookies ['auth_token'] ' – Arepo

+1

Poltergeist sürücüsü için yöntem ([Poltergeist GitHub sayfasında] (https://github.com/teampoltergeist/poltergeist) adresinde belgelendiği gibi) "page.driver.set_cookie()", 3 argümanı ise çerezin adı, değeri ve diğer şeylerin yanı sıra çerezin son kullanma değeri için bir seçenek sağlamadır. – sameers

İlgili konular