9
votes

Ruby sur les rails Test fonctionnel avec authentification Devise

Je cherche une solution pour un problème étrange. J'ai un contrôleur qui nécessite une authentification (avec le GEM Devise). J'ai ajouté les tests de crise, mais je ne peux pas le faire fonctionner. XXX PRE>

FIN P>

et je reçois la sortie suivante dans ma fenêtre "Test Rake": P >

29) Failure:
test_should_create_key(KeysControllerTest) [/test/functional/keys_controller_test.rb:29]:
"Key.count" didn't change by 1.
<3> expected but was
<2>.

 30) Failure:
test_should_destroy_key(KeysControllerTest) [/test/functional/keys_controller_test.rb:37]:
"Key.count" didn't change by -1.
<1> expected but was
<2>.

 31) Failure:
test_should_get_index(KeysControllerTest) [/test/functional/keys_controller_test.rb:19]:
Expected response to be a <:success>, but was <302>

 32) Failure:
test_should_get_new(KeysControllerTest) [/test/functional/keys_controller_test.rb:25]:
Expected response to be a <:success>, but was <302>


0 commentaires

3 Réponses :


24
votes

Utilisez-vous congez avec confirmé? Dans ce cas, la création ne suffit pas et vous devez confirmer l'utilisateur avec @ user.confirm!

second, pourquoi créez-vous l'utilisateur dans le test fonctionnel? Déclarez vos utilisateurs dans le luminaire comme celui-ci (confirmé_at si vous avez besoin de confirmation uniquement):

test / appareils / utilisateurs.yml: xxx

et signer-les Dans vos tests fonctionnels avec: xxx

éditer: je viens de voir, que dans mon application, les tests-TesthelPers sont déclarés dans tests / test-helpers.rb et je n'ai pas t sais si cela fait une différence, vous voulez peut-être essayer: xxx


4 commentaires

Impressionnant! Oui, j'utilise le paramètre confortable. Depuis le changement comme vous l'avez décrit, cela fonctionne comme un charme. :)


Est-ce que cela fonctionne vraiment? Je veux dire, Devise crypte les mots de passe avant de la mettre dans la base de données, et autant que je sache, les appareils sont directement écrits dans la base de données. Cela signifie que le déchiffrement devrait échouer (car ABCDEF1 ne décrypte pas correctement).


Quelqu'un peut-il ajouter un pointeur à la bonne réponse pour les nouvelles versions de congise?


Oui, crypté_password doit être défini avec le code en ligne pour mettre à jour la colonne avec les données cryptées. Voir Stackoverflow.com/a/10427785/18706



1
votes

Cela m'a pris un peu de temps pour comprendre mais il s'avère que la réponse est vraiment simple.

Le point est que, dans votre fichier de luminaires (utilisateurs.yml), vous devez vous assurer que l'utilisateur est "confirmé". (En supposant que vous avez spécifié «confortable» dans votre modèle utilisateur). Donc, par exemple, mettez ceci dans vos utilisateurs.yml: xxx

C'est tout, pas besoin de spécifier d'autres champs (courrier électronique, mot de passe crypté, etc.). de

maintenant dans votre test de contrôleur (par exemple, dans "Configuration" ou dans "avant"), vous cochez simplement: xxx

et puis il devrait Il suffit de travailler!


0 commentaires

0
votes

J'ai eu un problème similaire (mais en utilisant FactoryGirl, plutôt que des luminaires) et a été capable de le résoudre en utilisant simplement usinegirl.create (: utilisateur) plutôt que FactoryGirl.build (: utilisateur) .

Evidemment, Devise nécessite que l'utilisateur ait été persisté à la base de données, pour que tout fonctionne correctement.


0 commentaires