Как проверить метод clean_ <fieldname>? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь написать тест для моего метода clean_.

Вот код для моего теста

def test_clean_restraints(self):
    form = NewTaskForm(dict(restraints="90 20 <>"))
    form.clean_restraints()

На этом шаге я получаю сообщение об ошибке:

Error
Traceback (most recent call last):
  File "/home/user/django_projects/my_webservice/tasks/tests/test_forms.py", line 12, in test_clean_restraints
    form.clean_restraints()
  File "/home/user/django_projects/my_webservice/tasks/forms.py", line 22, in clean_restraints
    if self.cleaned_data.get('restraints') == '':
AttributeError: 'NewTaskForm' object has no attribute 'cleaned_data'

NewTaskForm выглядит следующим образом:

class NewTaskForm(ModelForm):
    class Meta:
        model = Task

    restraints = forms.CharField()
    region = forms.CharField()
    interactions = forms.CharField()

    def clean_restraints(self):
        if self.cleaned_data.get('restraints') == '':
            return self.cleaned_data.get('restraints')
        data = self.cleaned_data.get('restraints').strip().split('\n')
        regexp = re.compile(r'^(\d+)[\t ]+(\d+)[ \t]+([><]{2})?$')
        cleaned_data = []
        for i, line in enumerate(data):
            match = regexp.match(line)
            if not match:
                raise forms.ValidationError(f"Error in restraints in line {i + 1}")
            else:
                rst_1, rst_2, loop_type = match.groups()
                rst_1 = int(rst_1)
                rst_2 = int(rst_2)
                cleaned_data.append((rst_1, rst_2, loop_type))
        return cleaned_data

Я использую Django 2.1, python 3.7.1, PyCharm 2018.3.3 Professional Я попытался запустить его под отладчиком в PyCharm, но все сводится с ума.Я получаю другое сообщение об ошибке.Похоже, что отладчик остановился после полной проверки формы, игнорируя точки останова.Я понятия не имею, что происходит.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Хорошо, я нашел, что было не так.

form.cleaned_data создано в full_clean().Не в конструкторе, как я думал.Он также вызывает каждый clean_fieldname().Итак, уродливый обходной путь выглядит примерно так:

def test_clean_restraints(self):
    initial_data = dict(restraints="90 20 <>")
    form = NewTaskForm()
    form.cleaned_data = initial_data
    form.clean_restraints()
    (...)
0 голосов
/ 21 января 2019

Вы должны проверить результаты процесса проверки.

form = NewTaskForm(dict(restraints="90 20 <>"))
self.assertFalse(form.is_valid())
self.assertEqual(form.errors['restraints'], "Error in restraints in line 1")
...