Django - как unit test отправить запрос, используя request.FILES
У меня есть следующая логика:
def view_function(request):
if request.method == 'POST':
uploadform = UploadFileForm(request.POST, request.FILES)
if uploadform.is_valid():
#do stuff
Если параметр UploadFileForm равен:
class UploadFileForm(forms.Form):
file = forms.FileField()
Я пытаюсь написать модульные тесты для этого представления. Глядя в Django docs, предлагаемый способ таков:
class test_stuffTest(TestCase):
def setUp(self):
self.client = django.test.client.Client()
...
def test_stuff(self):
myfile = open('....\file.csv','r')
response = self.client.post('/', {'name':'file.csv','attachment':myfile})
#check response
Моя цель - загрузить uploadform.is_valid(), чтобы оценить значение True, поэтому я могу проверить код, который следует за проверкой формы. Когда я запускаю тест выше, uploadform.is_valid() оценивает значение False. Есть что-то, чего я не вижу? Является ли код в моем тесте, добавляя файл к request.FILES, или он делает что-то еще?
Ответы
Ответ 1
В документах поле файла называется attachment
, но в вашем, оно называется file
.
Вам не нужно name
в ваших пост-данных - это относится к другому полю с именем name
, а не к имени загружаемого файла.
Попробуйте следующее:
def test_stuff(self):
myfile = open('....\file.csv','r')
response = self.client.post('/', {'file':myfile})
Ответ 2
Способ django testsuite:
from django.core.files.uploadedfile import SimpleUploadedFile
f = SimpleUploadedFile("file.txt", b"file_content")
Таким образом вам не нужно создавать временный файл и писать на него, и вам не нужно издеваться над файлом (не так просто, как кажется).
Ответ 3
Может быть, я что-то пропустил здесь, но звучит как работа для хорошей макетной библиотеки. Мне лично очень нравится Mock. Но я попадаю в лагерь, который считает, что ваши модульные тесты должны быть свободны от всех внешних зависимостей (например, иметь файл с именем "file.csv" в определенном месте и т.д.).