Come devo scrivere i test per i moduli in Django?


110

Vorrei simulare le richieste alle mie visualizzazioni in Django quando scrivo i test. Questo è principalmente per testare le forme. Ecco uno snippet di una semplice richiesta di 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 pagina restituisce sempre una risposta di 200 indipendentemente dal fatto che sia presente o meno un errore di modulo. Come posso verificare che il mio modulo non sia riuscito e che il campo specifico ( soemthing) abbia avuto un errore?

Risposte:


250

Penso che se vuoi solo testare il modulo, dovresti solo testare il modulo e non la vista in cui viene visualizzato il modulo. Esempio per avere un'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

62
+1. L'idea degli unit test è testare ogni unità separatamente.
Daniel Roseman

13
@Daniel Ma i test di integrazione sono molto più utili e hanno maggiori probabilità di rilevare bug.
wobbily_col

19
@wobbily_col Ci vuole anche più tempo per individuare qual è il vero bug in un test di integrazione. In uno unit test è più ovvio. Penso che per una buona copertura di prova siano comunque necessari entrambi.
Torsten Engelbrecht

11
Questo è il modo in cui verifichi un errore di modulo specifico:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
Emil Stenström

18
self.assertEqual(form.is_valid(), True)potrebbe essere semplificato:self.assertTrue(form.is_valid())
Adam Taylor

76

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.')

Dove "modulo" è il nome della variabile di contesto per il modulo, "qualcosa" è il nome del campo e "Questo campo è obbligatorio". è il testo esatto dell'errore di convalida previsto.


Questo solleva un AttibuteError per me: AttributeError: l'oggetto "SafeUnicode" non ha attributi "errori"
sbaechler

per utenti inesperti: creare un utente in anticipo e utilizzarlo self.client.force_login(self.user)come prima riga nel metodo di test.
sgauri

Ho avuto un problema con questo post (), quindi ho capito che dovevo inviarlo come multipart come segue response = self.client.post ("/ form-url /", data = {'name': 'test123' , 'category': 1, 'note': 'note123'}, content_type = django.test.client.MULTIPART_CONTENT) Se qualcuno si blocca con l'istanza vuota durante il salvataggio del modulo, controlla le richieste inviate dal browser
Ghaleb Khaled

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.