我有这样的事情:
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
答案 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)
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测试框架的一部分。