一尘不染

如何在Django中对文件上传进行单元测试

django

在我的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

如何设置幸福道路的发车数据?有人可以告诉我吗?


阅读 465

收藏
2020-04-01

共2个答案

一尘不染

来自Django文档Client.post

提交文件是一种特殊情况。要发布文件,只需提供文件字段名称作为键,并提供要上传的文件的文件句柄作为值。例如:

c = Client()
with open('wishlist.doc') as fp:
  c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})
2020-04-01
一尘不染

我曾经做过同样的事情,with open('some_file.txt') as fp:但是后来我在仓库中需要图像,视频和其他真实文件,而且我正在测试经过良好测试的Django核心组件的一部分,所以目前这是我一直在做的事情:

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"

一切正常,SimpleUploadedFile创建的InMemoryFile行为类似于常规上传,你可以选择名称,内容和内容类型。

2020-04-01