2016-08-05 17 views
0

Ich stoße auf ein kleines Problem beim Schreiben eines Komponententests für ein Django-Formular. Ich möchte nur die is_valid() -Methode überprüfen und Beispiele gesehen haben, aber mein Code funktioniert nicht und nach einem Tag oder so, nachdem ich auf Google gelesen habe, muss ich die Antwort finden, die ich suche. Unten ist der Code für die forms.py und test_forms.pyDjango Formular unittest mit ChoiceField und MultipleChoiceField failing is_valid()

forms.py

class DataSelectForm(forms.Form): 
    #these are done in the init funct. 
    result_type = forms.ChoiceField(widget=forms.Select(attrs={'class': 'field-long'})) 
    band_selection = forms.MultipleChoiceField(widget=forms.SelectMultiple(attrs={'class': 'multiselect field-long'})) 
    title = forms.CharField(widget=forms.HiddenInput()) 
    description = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, result_list=None, band_list=None, *args, **kwargs): 
     super(DataSelectForm, self).__init__(*args, **kwargs) 
     if result_list is not None and band_list is not None: 
      self.fields["result_type"] = forms.ChoiceField(choices=result_list, widget=forms.Select(attrs={'class': 'field-long'})) 
      self.fields["band_selection"] = forms.MultipleChoiceField(widget=forms.SelectMultiple(attrs={'class': 'multiselect field-long'}), choices=band_list 

test_forms.py

def test_data_select_form(self): 
     results = ResultType.objects.all() 
     results_value = [] 
     for result in results: 
      results_value.append(result.result_type) 
     bands = SatelliteBand.objects.all() 
     bands_value = [] 
     for band in bands: 
      bands_value.append(band.band_name) 
     form_data = {'result_type': results_value, 'band_selection': bands_value, 'title': 'a title', 'description': 'some description'} 
     form = DataSelectForm(data = form_data) 

     print(form['title'].value()) 
     print(form['description'].value()) 
     print(form['result_type'].value()) 
     print(form['band_selection'].value()) 

     self.assertTrue(form.is_valid()) 

Das einzige, was ich bekomme, wenn ich die Testfall ausgeführt werden soll " AssertionError: False ist nicht wahr "Ich verstehe den Fehler, nur nicht, warum ich ihn bekomme. Ich gebe alle Daten ein und ich kann es sehen, wenn ich die Druckanweisungen ausführe. Ich habe versucht, den result_type und band_selection zu nehmen und es in den Konstruktor zu übergeben, anstatt dass es ein Teil der form_data ist, aber das hat auch nicht funktioniert. Was vermisse ich?

+1

vor der Assertion-Anweisung add '' 'form.is_valid(); print (form.errors) '' ' –

+0

Denken Sie auch darüber nach, Ihren Test auf die minimal erforderlichen Daten zu minimieren, damit er funktioniert. Anstelle von bands_value könnten Sie einfach ['test band name'] verwenden. Dann können Sie einen Heap von Linien löschen, um Bänder und bands_value einzurichten. Dadurch wird Ihr Test schneller und einfacher zu lesen. Sie können dasselbe auch für results_value tun. –

Antwort

2

Sie müssen result_list und band_list übergeben, wenn Sie Ihr Formular erstellen.

# These aren't the actual choices you want, I'm just showing that 
# choices should be a list of 2-tuples. 
result_list = [('result1', 'result1'), ('result2', 'result2'), ...] 
band_list = [('band1', 'band1'), ('band2', 'band2'), ...] 

DataSelectForm(result_list=result_list, band_list=band_list, data=form_data) 

Wenn Sie die Werte nicht an das Formular übergeben, legen Sie die Auswahlmöglichkeiten für die Felder nicht fest. Wenn die Felder keine Auswahlmöglichkeiten haben, können die Werte in der data-Datei nicht gültig sein, daher ist das Formular immer ungültig.

+0

tun es versucht, so eine Liste von Tupeln Füllung result_list und band_selection vorgeschlagen, die auf der Seite zu sehen würde, aber ich bekomme diese Fehlermeldung: Typeerror: __init __() bekam ein unerwartetes Stichwort Argument ‚result_type‘ –

+0

es war ein Tippfehler in meinem Antwort, es sollte "band_list" und "result_list" sein, wie in deiner '__init__' Methode. – Alasdair

+0

Also hatte ich anscheinend versucht, die Informationen in den __init__ oder als Teil der form_data zu geben, aber niemals beides. Danke, dass du das gelöscht hast für mich an meinem Ende. Definitiv ein klares Verständnis darüber, wie Formen als Ergebnis getestet werden. –

Verwandte Themen