2009-03-25 7 views
1

J'écris des tests de concombre pour une application basée sur Sinatra en utilisant Webrat. Pour certains tests que je dois mettre en œuvre un tel scénarioComment gérer les cookies lors des tests avec Webrat?

Given I am logged in as admin 
When I am visiting "/" 
Then I should see "Settings" 

Je définis pas comme ceci:

Given /^I am logged in as "(.+)"$/ do |user| 
    visit "/login" 
    fill_in "login", :with => user 
    fill_in "password", :with => "123456" 
    click_button "Login" 
end 

When /^I am viewing "(.+)"$/ do |url| 
    visit(url) 
end 

Then /^I should see "(.+)"$/ do |text| 
    response_body.should =~ /#{text}/ 
end 

réussit un cookie est créé

response.set_cookie(cookie_name, coockie_value) 

puis vérifié dans les vues lorsque l'utilisateur tente d'accéder aux pages d'administration via la méthode d'assistance:

def logged_in? 
    request.cookies[cookie_name] == cookie_value 
end 

Et il semble que Webrat ne stocke pas les cookies. Les tests ne signalent aucune erreur, mais "logged_in?" dans les vues est toujours faux, comme le cookie n'a pas été enregistré.

Est-ce que je fais quelque chose de mal? Si c'est juste comment Webrat fonctionne, quelle est la meilleure solution de contournement?

+0

Ce dernier exécute en fait votre application dans un processus séparé, ce qui signifie que vous ne pouvez pas accéder à la plupart des états Rails à partir de vos tests. – emk

+0

emk: merci, ça marche avec Selenium backend! –

Répondre

0

La solution de contournement consiste à utiliser Webrat avec l'extrémité arrière sélénium. Il exécute tous les tests dans une fenêtre Firefox séparée, donc les cookies ou javascript ne sont pas un problème. L'inconvénient est le temps supplémentaire et les ressources nécessaires pour exécuter Firefox et faire tous les clics réels, rendu, etc.

0

Vous pouvez avoir votre « Compte tenu/^ Je suis connecté » pas pirater logged_in?:

Given /^I am logged in as "(.+)"$/ do |user| 
    visit "/login" 
    fill_in "login", :with => user 
    fill_in "password", :with => "123456" 
    click_button "Login" 

    ApplicationController.class_eval <<-EOE 
     def current_user 
     @current_user ||= User.find_by_name(#{EOE}) 
     end 
    end 
EOE 
end 

Il sont deux inconvénients:

  1. Il est vraiment hackish de marketing mix-niveau et les problèmes au niveau du contrôleur comme celui-ci.
  2. Il sera difficile de se moquer des « Fin de session »
+0

Cela n'a pas fonctionné pour moi – davetron5000

1

Le vrai problème est la façon dont Sinatra traite des sessions dans l'environnement de test. Rechercher le groupe Google pour la discussion, mais la vraie solution est d'utiliser simplement:

use Rack::Session::Cookie 

et pas

enable :sessions 

Utilisation Sélénium est agréable mais il est surpuissant comme une solution pour le problème de l'OP. Utilisez-vous l'implémentation "Web" native de Webrat ou l'arrière-plan Selenium?

Questions connexes