我有一个生成并返回CSV文件的API:
def getCSV():
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=export.csv'
writer = csv.writer(response, csv.excel)
# ... Write some CSV content ...
return response
Run Code Online (Sandbox Code Playgroud)
当我从浏览器调用它时,这工作正常,但我无法弄清楚如何编写调用API的测试并检查CSV内容是否应该是什么.
如果我:
c = Client()
r = c.get('/my/export/api')
print(r.content)
Run Code Online (Sandbox Code Playgroud)
这只是打印三个字节,很可能在概念上完全错误.
如何在测试中获取CSV文件响应的内容?
我有一个提供文件下载的视图代码,它在浏览器中运行良好。现在我正在尝试使用内部 django Client.get 为它编写一个测试:
response = self.client.get("/compile-book/", {'id': book.id})
self.assertEqual(response.status_code, 200)
self.assertEquals(response.get('Content-Disposition'),
"attachment; filename=book.zip")
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在我想测试下载的文件是否是我希望它下载的文件。所以我开始说:
f = cStringIO.StringIO(response.content)
Run Code Online (Sandbox Code Playgroud)
现在我的测试运行器响应:
Traceback (most recent call last):
File ".../tests.py", line 154, in test_download
f = cStringIO.StringIO(response.content)
File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 282, in content
self._consume_content()
File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 278, in _consume_content
self.content = b''.join(self.make_bytes(e) for e in self._container)
File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 278, in <genexpr>
self.content = b''.join(self.make_bytes(e) for e in self._container)
File "/usr/lib/python2.7/wsgiref/util.py", line 30, in next
data = self.filelike.read(self.blksize)
ValueError: I/O operation on closed …Run Code Online (Sandbox Code Playgroud)