Невозможно инициализировать поля выбора в модульном тесте для формы django, где поле выбора заполняется из базы данных - PullRequest
0 голосов
/ 10 мая 2018

У меня есть одна форма django, где поле выбора заполняется из базы данных.

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

При написании модульного теста как:

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())

Теперь проблема в том, что при запускеtest, приложение загружается в первую очередь перед инициализацией db, следовательно, setUpClass для модульного теста не вызывается, а CLASS_CHOICE остается пустым, а проверка формы становится неудачной.Как можно избежать этого или повторно инициализировать поле выбора после создания одной записи в таблице Class.

1 Ответ

0 голосов
/ 10 мая 2018

То, как вы настроили этот класс, будет заполнено только один раз, когда модуль, содержащий ваш код, выполняется в первый раз. Это не идеально, потому что:

  • если будут добавлены новые классы, они не будут доступны в качестве опций выбора
  • база данных может быть не подключена, когда этот модуль загружен в память, что вызывает ошибки времени выполнения

Вам нужно сделать так, чтобы choices создавался динамически при каждом создании новой формы. Для этого сделайте choices вызываемой функцией, а не списком:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...