在我的django应用程序中,我有一个完成文件上传的视图。核心代码段是这样的
... if (request.method == 'POST'): if request.FILES.has_key('file'): file = request.FILES['file'] with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest: for chunk in file.chunks(): dest.write(chunk)
我想对视图进行单元测试。我正计划测试快乐路径和失败路径。即,request.FILES没有键“ file”的情况,request.FILES['file']有键“。”的情况None。
request.FILES
request.FILES['file']
None
如何设置幸福道路的发车数据?有人可以告诉我吗?
来自Django文档Client.post:
Client.post
提交文件是一种特殊情况。要发布文件,只需提供文件字段名称作为键,并提供要上传的文件的文件句柄作为值。例如:
c = Client() with open('wishlist.doc') as fp: c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})
我曾经做过同样的事情,with open('some_file.txt') as fp:但是后来我在仓库中需要图像,视频和其他真实文件,而且我正在测试经过良好测试的Django核心组件的一部分,所以目前这是我一直在做的事情:
with open('some_file.txt') as fp
from django.core.files.uploadedfile import SimpleUploadedFile def test_upload_video(self): video = SimpleUploadedFile("file.mp4", "file_content", content_type="video/mp4") self.client.post(reverse('app:some_view'), {'video': video}) # some important assertions ...
在Python 3.5+中,你需要使用bytesobject而不是str。更改"file_content"为b"file_content"
bytesobject
str
"file_content"
b"file_content"
一切正常,SimpleUploadedFile创建的InMemoryFile行为类似于常规上传,你可以选择名称,内容和内容类型。
SimpleUploadedFile
InMemoryFile