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?
vor der Assertion-Anweisung add '' 'form.is_valid(); print (form.errors) '' ' –
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. –