Я ищу модульное тестирование некоторой логики проверки формы в 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 , а не интеграционный тест, поэтому я избегаю ручной отправки запросов, публикации данных и т. Д. Я хочу, чтобыпо возможности, заполните форму и протестируйте ее логику проверки (большинство ответов, которые я нашел, были решениями по загрузке форм интеграционного тестирования).