В моем приложении django у меня есть представление, которое выполняет загрузку файлов. Основной фрагмент выглядит следующим образом
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Я хотел бы провести модульное тестирование представления. Я планирую протестировать счастливый путь, а также путь сбоя ... т.е. случай, когда у request.FILES
него нет ключевого файла, случай, когда request.FILES['file']
есть None
..
Как мне настроить данные поста для счастливого пути? Может кто-нибудь подскажет?
django
unit-testing
file-upload
Деймон
источник
источник
Ответы:
Из документов Django
Client.post
:источник
integration test
- на самом деле не имеет значения, пока вы не перейдете к более сложным кодовым базам, возможно, даже с реальной командой тестированияРаньше я делал то же самое,
with open('some_file.txt') as fp:
но потом мне понадобились изображения, видео и другие реальные файлы в репозитории, а также я тестировал часть основного компонента Django, который хорошо протестирован, поэтому в настоящее время я делаю вот что:В Python 3.5+ вам нужно использовать
bytes
объект вместоstr
. Изменить"file_content"
наb"file_content"
Он работает нормально,
SimpleUploadedFile
создает файл,InMemoryFile
который ведет себя как обычная загрузка, и вы можете выбрать имя, контент и тип контента.источник
"file_content"
необходимо, должен быть действительный заголовок изображения, чтобы ваш код считал его действительным изображением.Я рекомендую вам взглянуть на Django RequestFactory . Это лучший способ имитировать данные, указанные в запросе.
Сказал, что я нашел несколько недостатков в вашем коде.
Итак, я рекомендую вам провести рефакторинг вашего представления, чтобы использовать такую функцию, как:
И посмеемся над этим. Вы можете использовать Python Mock .
PS: Вы также можете использовать Django Test Client, но это будет означать, что вы добавляете еще одну вещь для тестирования, потому что этот клиент использует сеансы, промежуточное программное обеспечение и т. Д. Ничего похожего на модульное тестирование.
источник
profile_picture
которое внутренне используетupload_profile_picture
функцию. Если вы хотите протестировать это представление, просто имитируйте внутреннюю функцию и убедитесь, что она вызывается в вашем тесте. Это простой пример: gist.github.com/santiagobasulto/6437356Я делаю что-то подобное для своего собственного приложения, связанного с событиями, но у вас должно быть более чем достаточно кода, чтобы продолжить свой собственный вариант использования.
источник
Я сделал что-то подобное:
Функция create_image создаст изображение, поэтому вам не нужно указывать статический путь изображения.
Примечание: вы можете обновить код в соответствии с вашим кодом. Этот код для Python 3.6.
источник
В Django 1.7 есть проблема с TestCase, которая может быть решена с помощью open (filepath, 'rb'), но при использовании тестового клиента мы не контролируем его. Я думаю, что лучше всего убедиться, что file.read () всегда возвращает байты.
источник: https://code.djangoproject.com/ticket/23912 , автор KevinEtienne
Без параметра rb возникает ошибка TypeError:
источник
источник
Как упоминалось в официальной документации Django :
Дополнительная информация: как проверить, передан ли файл в качестве аргумента какой-либо функции?
Во время тестирования иногда мы хотим убедиться, что файл передается в качестве аргумента какой-либо функции.
например
В тестах используйте mock Python примерно так:
источник
Надеюсь это поможет.
источник
Я использую Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Я пробовал,
self.client.post
но получилResolver404
исключение.Для меня сработало следующее:
источник