如何编写填充raw_post_data和request.FILES ['myfile']的测试

时间:2011-12-21 18:23:48

标签: django unit-testing

我有这样的事情:

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 个答案:

答案 0 :(得分:2)

我假设你现在已经想到了这一点,但由于对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 :(得分:1)

你可以使用模拟。一些示例here和文档here


更新

Kit,我认为这很大程度上取决于你的测试用例。但一般来说,你不应该直接使用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'

答案 2 :(得分:1)

解释器提供的错误消息是正确的。通过if request.FILES访问POST数据后,您将无法再访问raw_post_data。如果你在实际的代码(而不是测试中)中遇到了那一行,那么它会在同一条消息中出错。基本上,您需要两个单独的视图用于基于表单的POSTS和直接文件POSTS。

答案 3 :(得分:0)

我使用此商家信息here

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

客户端是用于测试您的视图的特殊类。这是将文件发布到视图的示例。它是Django测试框架的一部分。