Как я могу написать тесты, которые заполняют raw_post_data и request.FILES ['myfile'] - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть что-то вроде этого:

def upload_something(request):
    data = {}
    if request.FILES:
        raw_file = request.FILES['myfile'].read()
    else:
        raw_file = request.raw_post_data

Кажется, я не могу написать юнит-тест, который заполняет raw_post_data, как бы я это сделал? Я просто хочу отправить файл изображения. Я пытаюсь создать тестовый случай, когда я читаю raw_post_data, и это ошибки с:

Вы не можете получить доступ к raw_post_data после чтения из потока данных запроса

Ответы [ 4 ]

2 голосов
/ 20 марта 2013

Я предполагаю, что вы уже поняли это, но поскольку ответы почти устарели из-за устаревания raw_post_data, я подумал, что выложу.

def test_xml_payload(self):
    data = '<?xml version="1.0" encoding="UTF-8"?><blah></blah>'
    response = self.client.post(reverse('my_url'),
                                data=data,
                                content_type='application/xml')


def my_view(request):
    xml = request.body
1 голос
/ 28 декабря 2011

Сообщение об ошибке, выданное переводчиком, является правильным.После доступа к данным POST через if request.FILES вы больше не можете получить доступ к raw_post_data.Если в вашем реальном коде (а не в тестах) вы попадете в эту строку, это приведет к ошибке с тем же сообщением.По сути, вам нужны два отдельных представления для POSTS на основе форм и прямых файловых POSTS.

1 голос
/ 22 декабря 2011

Вы можете использовать насмешки.Некоторые примеры доступны здесь и в документах здесь


Обновлен

Комплект, я думаю, это очень зависит от вашего теста.Но в целом вы не должны использовать raw_post_data напрямую.Вместо этого он должен быть исправлен, как в примере ниже:

from mock import Mock, MagicMock

class SomeTestCase(TestCase):

    def testRawPostData(self):
        ...

        request = Mock(spec=request)
        request.raw_post_data = 'myrawdata'
        print request.raw_post_data  # prints 'myrawdata'

        file_mock = MagicMock(spec=file)
        file_mock.read.return_value = 'myfiledata'
        request.FILES = {'myfile': file_mock}    
        print request.FILES['myfile'].read()  # prints 'myfiledata'
0 голосов
/ 30 декабря 2011

Я взял этот список здесь

c = Client()
f = open('wishlist.doc')
c.post('/customers/wishes/', {'name': 'fred', 'attachment': f})
f.close()

Клиент - это специальный класс для проверки ваших просмотров.Это пример размещения файлов на ваш взгляд.Это часть инфраструктуры тестирования Django.

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