2013-05-14 13 views
6

Ok, quindi ho bisogno di testare una vista unitaria, forma più precisa in una vista. Così ho creato un test unitario.Come si esegue il test dell'unità sui formati in Django?

class ViewTest(TestCase): 
    fixtures = ['fixture.json'] 
    def setUp(self): 
     self.client = Client() 
    def test_company_create(self): 
     post_data = { 
      'form-0-user': '', 
      'form-0-share': '', 
      'form-TOTAL_FORMS': 1, 
      'form-INITIAL_FORMS': 0, 
      'form-MAX_NUM_FORMS': 10 
     } 
    resp = self.client.post('/company/create/', post_data) 
    self.assertFormError (resp, 'shareholder_formset', 'share', 'This field is required.') 
    self.assertFormError (resp, 'shareholder_formset', 'user', 'This field is required.') 

Naturalmente torno un errore

AttributeError: 'ShareholderFormFormSet' object has no attribute 'fields'

Perché formset ha forme in esso, non i campi ..... Allora, qual è il modo corretto per testare un formset?

+0

Dai un'occhiata alla domanda simile: http://stackoverflow.com/questions/1630754/django-formset-unit-test. – alecxe

+0

@alecxe Quella domanda è simile solo nel senso che riguarda anche i formati e il test unitario ... @Viktor Che ne dici di testare il 'ShareholderForm'? Sembra che sia quello che stai cercando di fare con i tuoi asserzioni comunque ... – Ngenator

+0

Stai testando la vista e il modulo in questo test di "unità". Non c'è bisogno di fare un POST per testare un modulo. Vedere la sezione "Moduli di test" in [Guida al test in Django # 2] (http://toastdriven.com/blog/2011/apr/17/guide-to-testing-in-django-2/) – gertvdijk

risposta

2

Questo è un test funzionale (dal momento che si passa attraverso la vista, richiedere eventualmente il modello se lo si salva, ecc.).

Per i moduli, django-webtest è molto più facile da usare; non dovrai preoccuparti di questi dettagli: https://pypi.python.org/pypi/django-webtest

0

Come si fa notare, l'argomento del nome del form in assertFormError è in realtà solo una chiave in response.context_data. La chiave che stai utilizzando restituisce un elenco di moduli nel formset. Quindi, come hai scoperto, non funziona con assertFormError.

Un'opzione è usare assertEqual e basta fare un confronto diretto. Qualcosa di simile:

self.assertEqual(response.context_data[u'shareholder_formset'][form_index].errors['share'], 'This field is required.') 

Vorrei anche menzionare che il mio IDE (PyCharm) ha aiutato molto a capire questo fuori. Stavo lavorando su un problema simile. L'attivazione del debugger, l'inserimento di un punto di interruzione dopo la chiamata a post() e l'ispezione della risposta, hanno fornito la soluzione.

Problemi correlati