Модульное тестирование формы Django с пользовательской логикой проверки загрузки файлов (не интеграционное тестирование; нет запросов / сообщений / и т. Д.) - PullRequest
0 голосов
/ 29 января 2019

Я ищу модульное тестирование некоторой логики проверки формы в Django, но не знаю, как вручную ввести загруженный файл.Мое поле формы выглядит так:

sounds_to_upload = forms.FileField(widget=forms.ClearableFileInput(attrs={"multiple": True}))

Я пробовал:

file_info = {"sounds_to_upload": [SimpleUploadedFile("test_sound.wav", test_sound.read())]}

file_info = {"sounds_to_upload": SimpleUploadedFile("test_sound.wav", test_sound.read())}

file_info = {"sounds_to_upload": SimpleUploadedFile ("test_sound.wav", test_sound)}

file_info = {"sounds_to_upload": SimpleUploadedFile("test_sound.wav", test_sound.read())}
file_info["sounds_to_upload"].size = os.path.getsize(test_sound.name)

и много других вариаций.Они будут приведены в такую ​​форму:

form = SoundForm(data=self.sound_info, files=file_info)

И в моей форме я переписал метод clean(), чтобы он содержал:

for sound_file in self.cleaned_data["sounds_to_upload"]:
            if sound_file.size > 1024*1024:
                raise forms.ValidationError("File is too large (> 1 mB)")

Я такжепробовал for sound_file in self.cleaned_data.get("sounds_to_upload") и

cleaned_data = super(SoundForm, self).clean()
for sound_file in cleaned_data["sounds_to_upload"]:
    ...

(я пробовал все варианты различных изменений, описанных выше, но безрезультатно.)

Независимо от того, что я делаю, я получаю ошибку AttributeError: 'bytes' object has no attribute 'size', так что сам SimpleUploadedFile не доступен, только то, что читается из файла.Я предполагаю, что это означает, что я неправильно использую SimpleUploadedFile или как-то неправильно заполняю поле files формы.

Имейте в виду, что я пытаюсь написать тест unit , а не интеграционный тест, поэтому я избегаю ручной отправки запросов, публикации данных и т. Д. Я хочу, чтобыпо возможности, заполните форму и протестируйте ее логику проверки (большинство ответов, которые я нашел, были решениями по загрузке форм интеграционного тестирования).

...