django - как протестировать почтовый запрос, используя request.FILES - PullRequest
14 голосов
/ 04 марта 2012

У меня есть следующая логика:

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

Ответы [ 3 ]

36 голосов
/ 27 марта 2013

Как это делает набор тестов django:

from django.core.files.uploadedfile import SimpleUploadedFile
f = SimpleUploadedFile("file.txt", b"file_content")

Таким образом, вам не нужно создавать временный файл и записывать в него, и вам не нужно издеваться над файлом (не так какэто звучит просто)

17 голосов
/ 04 марта 2012

В документах поле файла называется attachment, но в вашем оно называется file.

Вам также не нужно name в ваших данных поста - это относится к другому полю с именем name, а не к имени файла, который вы загружаете.

Попробуйте следующее:

def test_stuff(self): 
    myfile = open('....\file.csv','r') 
    response = self.client.post('/', {'file':myfile})
3 голосов
/ 04 марта 2012

Может быть, я что-то здесь упускаю, но звучит как работа для хорошей фиктивной библиотеки.Лично мне очень нравится Mock .Но я попал в лагерь, который считает, что ваши модульные тесты должны быть свободны от всех внешних зависимостей (например, наличие файла с именем file.csv в определенном месте и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...