POST несколько файлов с использованием тестового клиента Django в одном запросе - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь создать несколько тестов для загрузки на моем сайте Django. Он позволяет загружать несколько файлов, поэтому мне нужно проверить, загружены ли несколько файлов.

Тестирование одного файла прекрасно работает:

from django.test import Client

def test_stuff(self): 
    with open('....\file.csv','rb') as fp:
        c = Client()
        response = c.post('/', {'name': 'Some Name', 'email': 'some@email.com', 'file': fp})

Но попытка сделать это со списком файлов не работает.

def test_stuff(self): 
    file_list = # get list of file paths to open
    myfiles = []
    for file in file_list:
        with open('....\file.csv','rb') as fp:
            myfiles.append(fp)
    c = Client()
    response = c.post('/', {'name': 'Some Name', 'email': 'some@email.com', 'file':myfiles})

И ни один не делает:

def test_stuff(self): 
    file_list = # get list of file paths to open
    myfiles = []
    for file in file_list:
        with open('....\file.csv','rb') as fp:
            myfiles.append(fp)
    c = Client()
    response = c.post('/', {'name': 'Some Name', 'email': 'some@email.com',}, files={'file':myfiles})

или

def test_stuff(self): 
    file_list = # get list of file paths to open
    myfiles = []
    for file in file_list:
        with open('....\file.csv','rb') as fp:
            myfiles.append(fp)
    c = Client()
    response = c.post('/', {'name': 'Some Name', 'email': 'some@email.com'}, files=myfiles)

Мое представление получает файлы из request.POST.get('myfiles'), но FILES пусто.

Есть ли способ отправить несколько файлов с помощью тестового клиента django, или я должен использовать что-то еще?

Отредактировано, чтобы сделать более точным

1 Ответ

0 голосов
/ 26 апреля 2019

Часть проблемы заключалась в том, что при with файл немедленно закрывается, выходя из оператора.Неудивительно, что другая часть получала данные в правильном формате.Тестовый клиент Django хочет ВСЕ данные в виде словаря, поэтому, поскольку я также отправлял имя пользователя и электронную почту, их необходимо было отформатировать следующим образом:

def test_stuff(self): 
    file_list = # get list of file paths to open
    data = {}
    files = []
    for file in file_list:
        fp = open('....\file.csv','rb')
        files.append(fp)
    data['myfiles'] = files
    data['name'] = 'Some Name'
    data['email'] = 'some@email.com'
    c = Client()
    response = c.post('/', data)
...