Подтвердить что ты не робот

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, или он делает что-то еще?

4b9b3361

Ответ 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" в определенном месте и т.д.).