2013-05-14 10 views
6

Ok, więc muszę przetestować widok jednostki, bardziej precyzyjny formularz w widoku. Więc tworzę taki test jednostkowy.W jaki sposób testujesz zestawy formularzy w 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.') 

Oczywiście ja wrócę błąd

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

względu formset ma formularzy w niej, a nie pola ..... Więc co jest poprawny sposób przetestować formset?

+0

Spójrz na podobne pytanie: http://stackoverflow.com/questions/1630754/django-formset-unit-test. – alecxe

+0

@alecxe To pytanie jest podobne tylko w tym sensie, że dotyczy to również formsetów i testów jednostkowych ... @Viktor A co z testowaniem 'ShareholderForm'? Wygląda na to, że tak czy owak próbujesz zrobić to ze swoimi twierdzeniami ... – Ngenator

+0

Oboje testujesz widok i formę w teście "jednostkowym". Aby przetestować formularz, nie trzeba wykonywać testu POST. Zobacz sekcję "Testowanie formularzy" w [A Guide to Testing in Django # 2] (http://toastdriven.com/blog/2011/apr/17/guide-to-testing-in-django-2/) – gertvdijk

Odpowiedz

2

To jest test funkcjonalny (ponieważ przeglądasz widok, możesz poprosić o model, jeśli go zapiszesz itp.).

Dla formularzy django-webtest jest dużo łatwiejszy w użyciu; nie musisz się martwić o te szczegóły: https://pypi.python.org/pypi/django-webtest

0

Jak wskazujesz, argument nazwa formularza w assertFormError jest tak naprawdę tylko kluczem w response.context_data. Klucz, którego używasz, zwraca listę formularzy w zestawie. Tak więc, jak odkryłeś, to nie działa z assertFormError.

Jedną z opcji jest użycie assertEqual i zrobienie bezpośredniego porównania. Coś jak:

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

Chciałbym również wspomnieć, że moja IDE (pycharm) pomogło w zastanawianie to. Pracowałem nad podobnym problemem. Włączenie debuggera, umieszczenie punktu przerwania po wywołaniu funkcji post() i sprawdzeniu odpowiedzi, dało rozwiązanie.

Powiązane problemy