django - 如何使用request.FILES对post请求进行单元测试

vas*_*ek1 14 python django unit-testing

我认为我有以下逻辑:

def view_function(request):
    if request.method == 'POST':
        uploadform = UploadFileForm(request.POST, request.FILES)
        if uploadform.is_valid():
            #do stuff
Run Code Online (Sandbox Code Playgroud)

UploadFileForm等于的位置:

class UploadFileForm(forms.Form):
    file = forms.FileField()
Run Code Online (Sandbox Code Playgroud)

我正在尝试为此视图编写单元测试.查看Django文档,建议的方法是:

class test_stuffTest(TestCase):
    def setUp(self):
        self.client = django.test.client.Client()
    ...
    def test_stuff(self):
        myfile = open('....\file.csv','r')
        response = self.client.post('/', {'name':'file.csv','attachment':myfile})
        #check response
Run Code Online (Sandbox Code Playgroud)

我的目标是让uploadform.is_valid()评估为True,这样我就可以测试表单验证之后的代码.当我运行上面的测试时,uploadform.is_valid()的计算结果为False.有什么我想念的吗?我的测试中的代码是将文件添加到request.FILES,还是在做其他事情?

rad*_*rba 37

django的测试工具的方式是:

from django.core.files.uploadedfile import SimpleUploadedFile
f = SimpleUploadedFile("file.txt", b"file_content")
Run Code Online (Sandbox Code Playgroud)

这样您就不需要创建临时文件并写入它,并且您不需要模拟文件(不像听起来那么简单).

  • 谢谢,你让我免于嘲笑文件!Python3 django 1.10 更新我不得不在文件内容之前放置 `b`,就像这样 `f = SimpleUploadedFile("file.txt", b"file_content")` 因为 TypeError (2认同)

Ala*_*air 18

在文档中,文件字段被调用attachment,但在你的文件字段中,它被调用file.

name的帖子数据中也不需要- 指的是另一个被调用的字段name,而不是您要上传的文件的名称.

请尝试以下方法:

def test_stuff(self): 
    myfile = open('....\file.csv','r') 
    response = self.client.post('/', {'file':myfile})
Run Code Online (Sandbox Code Playgroud)