2013-05-14 7 views
6

Ok, also muss ich Unit-Test eine Ansicht, genauere Form in einer Ansicht. Also erstelle ich einen solchen Komponententest.Wie testen Sie Formsets 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.') 

Ofcourse bekomme ich wieder ein Fehler

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

Da formset Formen in sich hat, nicht Felder ..... Also, was ist der richtige Weg, um einen Formularsatz zu testen?

+0

Werfen Sie einen Blick auf die ähnliche Frage: http://stackoverflow.com/questions/1630754/django-formset-unit-test. – alecxe

+0

@alecxe Diese Frage ist nur in dem Sinne ähnlich, dass es auch um Formsets und Unit-Testing geht ... @Viktor Wie wäre es damit, nur das 'ShareholderForm' zu testen? Es sieht so aus, als ob Sie das mit Ihren Behauptungen versuchen würden ... – Ngenator

+0

Sie testen beide die Ansicht und das Formular in diesem "Unit" Test. Zum Testen eines Formulars ist kein POST erforderlich. Siehe den Abschnitt "Testformulare" in [Eine Anleitung zum Testen in Django # 2] (http://toastdriven.com/blog/2011/apr/17/guide-to-testing-in-django-2/) – gertvdijk

Antwort

2

Das ist ein Funktionstest (seit Sie durch die Ansicht gehen, möglicherweise das Modell anfordern, wenn Sie es speichern, usw.).

Für die Formulare ist Django-Webtest viel einfacher zu bedienen; Sie müssen sich keine Gedanken über diese Details machen:

0

Wie Sie darauf hinweisen, ist das Formularnamenargument in assertFormError wirklich nur ein Schlüssel in response.context_data. Der Schlüssel, den Sie verwenden, gibt eine Liste von Formularen in dem Formset zurück. Wie Sie herausgefunden haben, funktioniert es nicht mit assertFormError.

Eine Möglichkeit ist es, assertEqual zu verwenden und nur einen direkten Vergleich durchzuführen. Etwas wie:

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

ich auch erwähnen möchte, dass meine IDE (PyCharm) aus vielen in herauszufinden, das halfen. Ich arbeitete an einem ähnlichen Problem. Das Einschalten des Debuggers, das Setzen eines Haltepunktes nach dem Aufruf von post() und das Überprüfen der Antwort gaben die Lösung.

Verwandte Themen