Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django单元测试,用于测试文件下载_Django_Unit Testing - Fatal编程技术网

Django单元测试,用于测试文件下载

Django单元测试,用于测试文件下载,django,unit-testing,Django,Unit Testing,现在我正在检查链接的响应,如下所示: self.client = Client() response = self.client.get(url) self.assertEqual(response.status_code, 200) 是否有Django ic方法来测试链接,以查看是否确实发生了文件下载事件?似乎找不到有关此主题的太多资源。如果url旨在生成文件而不是“正常”http响应,则其内容类型和/或内容配置将不同 响应对象基本上是一个字典,因此您可以 self.assertEquals

现在我正在检查链接的响应,如下所示:

self.client = Client()
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

是否有Django ic方法来测试链接,以查看是否确实发生了文件下载事件?似乎找不到有关此主题的太多资源。

如果url旨在生成文件而不是“正常”http响应,则其
内容类型和/或
内容配置将不同

响应对象基本上是一个字典,因此您可以

self.assertEquals(
    response.get('Content-Disposition'),
    "attachment; filename=mypic.jpg"
)
更多信息:

UPD: 如果要读取附件的实际内容,可以使用response.content。zip文件的示例:

try:
    f = io.BytesIO(response.content)
    zipped_file = zipfile.ZipFile(f, 'r')

    self.assertIsNone(zipped_file.testzip())        
    self.assertIn('my_file.txt', zipped_file.namelist())
finally:
    zipped_file.close()
    f.close()

你的意思是要检查文件的实际内容吗?您可以使用
response.content
——我正试图做这件事,但每当我使用response.content做任何事情时,都会得到错误“ValueError:I/O operation on closed file”,甚至会将其传递给StringIO。看起来这就是原因:遇到了与@JustinBlake相同的问题,但链接的解决方案并不理想。IO错误是Django的测试客户端关闭响应的一个错误:使用流式响应绕过了这个问题,只是因为测试客户端没有关闭响应,但我不建议更改生产代码。请注意文档中的警告:>StreamingHttpResponse仅应在绝对需要的情况下使用。。。例如,无法使用
io.BytesIO
(Python 3)而不是StringIO.StringIO生成ETag和内容长度标题(这是针对Python 2的,在Python 3中,我们在
io
模块之后调用StringIO,io.StringIO给出错误:
类型错误:初始值必须是str或None,而不是bytes
)。所以我做了
f=io.BytesIO(response.content)
,它成功了。