Rails + Cucumber / Capybara:如何在测试中设置/检索cookie?

我正在实现一个懒惰的登录function。 我的黄瓜function应该描述它:

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中的beforefilter使用,以便打开全新浏览器的用户将自动登录:

 class SessionsController  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中的beforefilter:

 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 

所以问题是在我的黄瓜function的最后一步, cookies.signed[:auth_token]返回nil。 我猜这只是一个水豚的事情。 那么我真的必须在测试中设置一个cookie而不是在我的控制器中使用它吗?

所以最终我在尝试了很多不同的事情之后想出来了。

 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 

更新:

这是我在使用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 

使用包含驱动程序方法的https://github.com/nruth/show_me_the_cookies 。 它有获取cookie,删除cookie的方法,以及创建名为create_cookie cookie的方法。