¿Cómo debo escribir pruebas para Formularios en Django?

3 minutos de lectura

avatar de usuario
Mridang Agarwalla

Me gustaría simular solicitudes a mis vistas en Django cuando estoy escribiendo pruebas. Esto es principalmente para probar los formularios. Aquí hay un fragmento de una solicitud de prueba simple:

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 página siempre devuelve una respuesta de 200 ya sea que haya un error de formulario o no. ¿Cómo puedo verificar que mi formulario falló y que el campo en particular (soemthing) tuvo un error?

avatar de usuario
Torsten Engelbrecht

Creo que si solo desea probar el formulario, debe probar el formulario y no la vista donde se representa el formulario. Ejemplo para hacerse una idea:

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

  • +1. La idea de unidad pruebas es probar cada unidad por separado.

    – Daniel Rosemann

    5 de septiembre de 2011 a las 8:11

  • @Daniel Pero las pruebas de integración son mucho más útiles y es más probable que detecten errores.

    – wobbily_col

    27 de febrero de 2014 a las 11:57

  • @wobbily_col También lleva más tiempo detectar cuál es el error real en una prueba de integración. En una prueba unitaria es más obvio. Sin embargo, creo que para una buena cobertura de prueba necesitas ambos.

    – Torsten Engelbrecht

    28 de febrero de 2014 a las 9:36

  • Así es como verifica un error de formulario específico: self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])

    – Emil Stenström

    30 de junio de 2014 a las 14:54

  • self.assertEqual(form.is_valid(), True) podría simplificarse: self.assertTrue(form.is_valid())

    – Adán Taylor

    22 de agosto de 2014 a las 21:10

avatar de usuario
Shane

https://docs.djangoproject.com/en/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.')

Donde “formulario” es el nombre de la variable de contexto para su formulario, “algo” es el nombre del campo y “Este campo es obligatorio”. es el texto exacto del error de validación esperado.

  • Esto genera un AttibuteError para mí: AttributeError: el objeto ‘SafeUnicode’ no tiene ningún atributo ‘errores’

    – sbaechler

    15 de mayo de 2012 a las 9:45


  • para usuarios novatos: cree un usuario de antemano y use self.client.force_login(self.user) como primera línea en el método de prueba.

    – sgauri

    15 de marzo de 2018 a las 9:30

  • Tuve un problema con esta publicación(), luego descubrí que tenía que enviarla en varias partes como sigue: respuesta = self.client.post(“/form-url/”, data={ ‘name’: ‘test123’ , ‘category’: 1, ‘note’: ‘note123’ }, content_type=django.test.client.MULTIPART_CONTENT) Si alguno se quedó con una instancia vacía al guardar el formulario, verifique las solicitudes enviadas desde el navegador

    – Ghaleb Khaled

    26 de diciembre de 2018 a las 15:46


avatar de usuario
Juan Mee

La respuesta original de 2011 fue

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

Pero ya veo (2018) hay una gran cantidad de afirmaciones aplicables disponibles:

  • afirmarElevarMensaje
  • aseverarFieldOutput
  • aseverarFormError
  • aseverarFormsetError

Elige tu opción.

¿Ha sido útil esta solución?