Résolue

Tests unitaire sur l'utilisateur

# Résolution d'erreurs # Django # Tests unitaires

Gabriel Trouvé

Mentor

Bonsoir,

Je suis en train d'essayer de faire des tests unitaires.
J'en ai réussi un simple (voir bidon lol) pour tester si l'utilisateur n'est pas actif.
Mais je veux faire un autre test :

    def test_signup(self):
        c = Client()
        response = c.post(reverse("account:signup"), data={"username": "gabigab119",
                                                           "email": "[email protected]",
                                                           "first_name": "Trouvé", "last_name": "Gabriel",
                                                           "password": "Gros_MotdePasse_Demalad2"})
        user = Hero.objects.get(username="gabigab119")
        self.assertTrue(user.avatar)

je veux tester si j'ai bien un avatar d'attribué.

Sauf que j'ai cette erreur :
accounts.models.Hero.DoesNotExist: Hero matching query does not exist.
Pourtant j'utilise bien le c.post sur la bonne vue.
je me suis en plus aidé de la doc

Merci d'avance

Code complet :

from django.test import TestCase, Client
from django.urls import reverse

from accounts.models import Hero, HeroAvatar


class HeroTest(TestCase):
    def setUp(self):
        self.hero1 = Hero.objects.create_user(username="gabigab",
                                              email="[email protected]",
                                              first_name="Gabriel",
                                              last_name="Trouvé",
                                              password="12345678")
        self.avatar1 = HeroAvatar.objects.create(name="avatar")

# Test 1
    def test_if_hero_is_active(self):
        user = self.hero1
        self.assertFalse(user.is_active)

# Test 2
    def test_signup(self):
        c = Client()
        response = c.post(reverse("account:signup"), data={"username": "gabigab119",
                                                           "email": "[email protected]",
                                                           "first_name": "Trouvé", "last_name": "Gabriel",
                                                           "password": "Gros_MotdePasse_Demalad2"})
        user = Hero.objects.get(username="gabigab119")
        self.assertTrue(user.avatar)

Thibault houdon

Mentor

Salut Gab !

Sur le papier ça me semble bon, il faudrait que tu fasses du debug pour vérifier ce qu'il se passe.

Déjà tu peux rajouter une assertion pour vérifier si la page renvoie bien un statut 200 :

self.assertEqual(response.status_code, 200)  # (ou 302 si tu rediriges après l'inscription)

Aussi, je te conseillerais du coup de faire deux tests séparés car là tu teste deux choses dans le même test (le signup et l'avatar).

Et du coup pour le problème, met un point de debug après la requête post et analyse le contenu de la réponse pour voir ce qu'il se passe, tu dois avoir un bug (un champ mal rempli ou vide dans le formulaire ?).

Ah je n'ai pas lancé le debug je viens de penser à quelque chose :
J'ai un Recaptcha...

ça fait 45 minutes que j'essaye de passer la sécurité du recaptcha pour mon test avec ce que je vois sur stack, et la doc django-captcha mais rien à faire.

Du coup je ne sais pas si c'est utile de tester ça au final, car je perds du temps avec le recaptcha...

Peut-être plutôt me concentrer sur la partie appli jeu de rôle - récit ?

Thibault houdon

Mentor

Ah oui c'est très probablement ça, le mieux c'est d'enlever le captcha pour les tests.

Tu peux dans ton settings.py créer une variable pour vérifier si tu es en mode de test, par exemple comme ça :

TEST_MODE = 'test' in sys.argv

Ou même utiliser la valeur de DEBUG car en fait tu n'as pas besoin du captcha quand tu développes en local ou lance des tests, c'est vraiment juste pour la prod.

Comme ça tu peux "bypasser" la vérification du captcha en mode de debug / test.

Gabriel Trouvé

Mentor

J'ai essayé avec DEBUG.

Et j'ai essayé avec TEST_MODE :

settings :

# Google recaptcha
RECAPTCHA_PUBLIC_KEY = env("RECAPTCHA_PUBLIC_KEY")
RECAPTCHA_PRIVATE_KEY = env("RECAPTCHA_PRIVATE_KEY")
TEST_MODE = 'test' in sys.argv

forms :

class HeroCreationForm(UserCreationForm):
    if not TEST_MODE:
        security = ReCaptchaField(label="Sécurité")

    class Meta:
        model = get_user_model()
        fields = ["username", "email", "first_name", "last_name"]

Et l'erreur :
https://goopics.net/i/kks5k9

(j'ai un bug au moment d'up l'img sur docstring)

Rien n'y fait tjs le même problème il ne trouve pas l'user.

Après est-ce que c'est utile de tester le signup ? ça se fait des fois ?

Thibault houdon

Mentor

Salut Gab :)

Ah oui tu passes par une CBV.

Tu as bien importé TEST_MODE depuis les settings ? Possible de voir la classe HeroCreationForm au complet ?

Aussi, je te conseille en premier lieu d'essayer carrément d'enlever le security, il y a peut-être un problème avec la définition de la variable TEST_MODE ou la façon dont la CBV gère tout ça.

Du coup pour un premier debug le mieux est d'enlever complètement le captcha, lancer ton test et voir si ça fonctionne.

Si c'est le cas : on est sûr que le problème vient bien du captcha et il ne reste plus qu'à s'assurer qu'en mode de test il soit désactivé.

C'est mieux de procéder comme ça parce que si ça se trouve le problème ne vient pas du captcha et on cherche du mauvais côté ;)

Et oui c'est important de tester le signup c'est un élément clé de l'app !

En prime dans une application finale, tu peux aussi faire un test d'intégration complet (avec le captcha) sur la version en prod avec une lib comme SeleniumBase ;) Mais c'est un peu plus avancé.

Gabriel Trouvé

Mentor

Salut Thibault !

ça ne vient pas du captcha apparemment.
https://github.com/gabigab117/webrpg/blob/without_captcha_test/project/accounts/models.py

J'ai crée une branche test où j'ai enlevé le captcha et j'ai le même problème... lol

class HeroCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ["username", "email", "first_name", "last_name"]

Salut Gab !

Je vais cloner ton projet pour tester de mon côté je te tiens au courant !

Bon et bien après plus de 30mn d'essais malheureusement je bloque aussi 😅

Je suis sur cette erreur :

  File "/Users/thibh/webrpg/project/accounts/views.py", line 18, in signup
    hero = form.save()
  File "/Users/thibh/webrpg/project/venv/lib/python3.9/site-packages/django/contrib/auth/forms.py", line 141, in save
    user.set_password(self.cleaned_data["password1"])
KeyError: 'password1'

J'ai enlevé tout les trucs qui pouvaient poser problème (recaptcha, validation mail), mais rien n'y fait.

Je ne suis pas habitué au UserCreationForm, j'ai vu qu'il y avait des changements avec la 4.2 de Django dans la doc, mais tu utilises la 4.2.3.

On va continuer à investiguer !

Gabriel Trouvé

Mentor

Ok merci Thibault ce n'est pas grave. De toute façon ce n'est pas bloquant pour mon projet ^^

Hello à tous,
En testant partie par partie ta vue signup, j'ai trouvé ! J'avais déjà eu la même erreur.
Le UserCreationForm ça crée deux mots de passe "password1" et "password2" donc il faut bien les envoyer sinon ton formulaire n'est pas valide!
Il suffit donc de corriger le test:

    def test_signup(self):
        c = Client()
        response = c.post(reverse("account:signup"), data={"username": "gab",
                                                           "email": "[email protected]",
                                                           "first_name": "Trouvé", "last_name": "Gabriel",
                                                           "password1": "Gros_MotdePasse_Demalad2",
                                                           "password2": "Gros_MotdePasse_Demalad2"})
        user = Hero.objects.get(username="gab")
        print(user)

A plus! :)

Hugo

Gabriel Trouvé

Mentor

Et oui je suis un boulet j'ai zappé de confirmer le MDP... du coup je re essayerai peut être avec le captcha lol

merci à tous ! :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.