/ / Auswahlfelder im Unit-Test für Django-Formulare können nicht initialisiert werden, wenn das Auswahlfeld aus db ausgefüllt wird - Django, Unit-Testing, Django-Formulare

Auswahlfelder im Unit-Test für Django-Formulare können nicht initialisiert werden, wenn das Auswahlfeld aus db ausgefüllt wird - Django, Unit-Testing, Django-Formulare

Ich habe eine Django-Form, in der ein Auswahlfeld von db ausgefüllt wird.

class TestForm(forms.Form):
CLASS_CHOICE = []
classes = Class.objects.filter(std__gte=4)
for cls in classes:
CLASS_CHOICE.append((cls.code,
"{} - {}".format(cls.code,cls.std)))
name = forms.CharField()
class = forms.ChoiceField(choices = CLASS_CHOICE)

def _post_clean(self):
# some validation
pass

Beim Schreiben seines Unit-Tests als:

class SampleTest(TestCase):

@classmethod
def setUpClass(cls):
super(SampleTest, cls).setUpClass()
cls.class = Class.objects.create(std=10,code="A")

def test_valid_form(self):
post_data = {"name":"testing",
"class":"A" }
f = TestForm(data=post_data)
self.assertTrue(f.is_valid())

Das Problem ist nun, dass beim Ausführen des Tests die Anwendung zuerst geladen wird, bevor db initialisiert wird, daher die setUpClass für Unit Test wird nicht aufgerufen und CLASS_CHOICE bleibt leer und die Formularüberprüfung schlägt fehl. Wie kann ich dies vermeiden oder das Auswahlfeld neu initialisieren, nachdem ich einen Eintrag in erstellt habe? Class Tabelle.

Antworten:

0 für die Antwort № 1

Die Art und Weise, wie Sie die Klassenauswahl eingerichtet haben, wird nur einmal ausgefüllt, wenn das Modul, das Ihren Code enthält, zum ersten Mal ausgeführt wird. Dies ist weniger als ideal, weil:

  • Wenn neue Klassen hinzugefügt werden, sind sie nicht als Auswahloptionen verfügbar
  • Die Datenbank ist möglicherweise nicht verbunden, wenn dieses Modul in den Speicher geladen wird, was zu Laufzeitfehlern führt

Sie müssen es so machen, dass choices wird jedes Mal dynamisch erstellt, wenn ein neues Formular erstellt wird. Um dies zu tun, machen choices eine aufrufbare Funktion statt einer Liste:

def get_class_choices():
class_choice = []
classes = Class.objects.filter(std__gte=4)
for cls in classes:
class_choice.append((cls.code, "{} - {}".format(cls.code, cls.std)))
return class_choice


class TestForm(forms.Form):

name = forms.CharField()
class = forms.ChoiceField(choices=get_class_choices)

def _post_clean(self):
# some validation
pass