web-dev-qa-db-fra.com

Comment dois-je écrire des tests pour les formulaires dans Django?

J'aimerais simuler des requêtes sur mes vues dans Django lorsque je rédige des tests. Il s'agit principalement de tester les formulaires. Voici un extrait d'une simple requête de test:

from Django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertEqual(response.status_code, 200) # we get our page back with an error

La page renvoie toujours une réponse de 200, qu'il y ait une erreur de formulaire ou non. Comment puis-je vérifier que mon formulaire a échoué et que le champ particulier (soemthing) contenait une erreur?

98
Mridang Agarwalla

Je pense que si vous voulez juste tester le formulaire, vous devriez alors tester le formulaire et non la vue où le formulaire est rendu. Exemple pour avoir une idée:

from Django.test import TestCase
from myapp.forms import MyForm

class MyTests(TestCase):
    def test_forms(self):
        form_data = {'something': 'something'}
        form = MyForm(data=form_data)
        self.assertTrue(form.is_valid())
        ... # other tests relating forms, for example checking the form data
230

https://docs.djangoproject.com/fr/stable/topics/testing/tools/#Django.test.SimpleTestCase.assertFormError

from Django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertFormError(response, 'form', 'something', 'This field is required.')

Où "formulaire" est le nom de la variable de contexte de votre formulaire, "quelque chose" est le nom du champ et "Ce champ est obligatoire". est le texte exact de l'erreur de validation attendue.

73
Shane

La réponse originale de 2011 était

self.assertContains(response, "Invalid message here", 1, 200)

Mais je vois maintenant (2018) il y a toute une foule d'affirmations applicables disponibles :

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

Faites votre choix.

12
John Mee