2009-05-30 19 views
2

Comment envoyer un cookie dans un test fonctionnel? Comment puis-je tester pour être sûr que le cookie est effacé? J'ai eu beaucoup de succès en utilisant TDD pour construire les modèles pour une application Rails, mais j'ai rencontré un problème en ce qui concerne le test du contrôleur: je peux définir les valeurs des cookies une fois dans un test et les lire, mais je ne peux pas les effacer. C'est:Test de l'effacement des valeurs de cookie dans Rails?

test "clears cookie" do 
    get :set_it, :stuff => {'key' => 'value'} # stuff to cookify 
    assert cookies['key'] == 'value' # works fine 

    get :clear_it # cookie doesn't get sent. How do I simulate this? 
    assert nil == cookies['key'], 'Cookie not cleared' # fails 
end 

Le guide d'essai des rails ne mentionne pas comment simuler l'envoi d'un cookie dans un test, juste comment vérifier que les données ont été définies sur le serveur. Je sais que j'ai déjà rencontré une situation où les données de cookies ne sont pas modifiées sur le serveur tant que la réponse n'est pas envoyée. Est-ce que c'est ce qui se passe ici? J'avais espéré que les tests fonctionnels auraient mieux fait d'être le client.

Est-ce un problème largement connu? Les gens se résignent-ils simplement à utiliser JUnit pour ce genre de chose? J'aimerais vraiment être en mesure d'utiliser un cadre pour tous ou presque tous de mon tdd.


pur désespoir et devinettes m'a amené à essayer avec optimisme @ Response.Cookies, mais cela ne fonctionne pas non plus.

+0

Notez que les tests manuels - impression des cookies dans un fichier * .html.erb - révèlent que les cookies sont en effet effacés. Pourquoi ne peut pas ce travail? !! – Mike

Répondre

1

Mon test logout avait

assert_nil @response.cookies["auth_token"] 

qui fonctionne.

Quelle est la valeur que vous obtenez sinon zéro?

+0

J'ai essayé d'utiliser ce test, mais le problème est qu'il n'échoue pas si je ne supprime pas le cookie. – Tobias

2

Si vous voulez effectuer un test unitaire spécifique autour de la désactivation d'un cookie, alors vous testez réellement si la réponse contient un en-tête qui met le cookie à zéro. Je suppose que votre get :clear_it fait cookies.delete :cookie-name. Cela définit response.header pour contenir Set-[COOKIE-NAME]=;. Donc, si d'autres méthodes échouent, vous pouvez simplement rechercher cette chaîne directement.

Ce qui semble louche dans votre code, c'est que vous vérifiez simplement cookies directement. Où va la réponse à partir de votre demande 'get'? Si tout le reste échoue, vous pouvez également utiliser des tests d'intégration avec webrat comme discuté here. Cela peut ne pas être aussi bon que le test unitaire, mais il vérifiera au moins la fonctionnalité.

+0

C'est la meilleure réponse que j'ai trouvée au cours de ma recherche, elle devrait certainement être acceptée. –