Rails + Concombre/Capybara: Comment créer/récupérer les cookies dans les tests?
Je me suis mise en œuvre d'un paresseux login. Mon concombre fonction doit décrire:
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
Et ce sont mes étape définitions:
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
C'est ce qui arrive lorsqu'un utilisateur se connecte: la cookies.signed[:auth_token]
est défini. Il sera utilisé par un avant de filtre dans mon ApplicationController de sorte que les utilisateurs qui ouvrent un nouveau navigateur sera automatiquement connecté:
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
fin
C'est l'avant du filtre dans mon 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
De sorte que le problème est que dans la dernière étape de mon concombre fonctionnalité, cookies.signed[:auth_token]
retourne nil. Je devine que c'est juste un capybara chose. Donc j'en fait de définir un cookie dans l'essai plutôt que d'utiliser celui de mon contrôleur?
Vous devez vous connecter pour publier un commentaire.
Donc finalement, j'ai compris après avoir essayé beaucoup de choses différentes.
Mise à JOUR:
Voici ce que j'utilise dans le cas où je suis en utilisant le Sélénium pour certains tests:
Capybara.current_session.driver.request.cookies.[]('auth_token')
, pourquoi ne pas utiliser Ruby standard de sucre pour le hachage - ieCapybara.current_session.driver.request.cookies['auth_token']
page.driver.set_cookie()
, et ses 3 arguments sont le témoin du nom, de sa valeur, et l'une des options de hachage pour le réglage, entre autres choses, la valeur d'expiration du cookie.Utilisation https://github.com/nruth/show_me_the_cookies qui enveloppe le conducteur méthodes. Il a des méthodes pour obtenir des cookies, supprimer les cookies, et une méthode pour créer des cookies appelé
create_cookie
.create_cookie
a été documentée dans le fichier lisez-moi, si je suis à jour de ma réponse.