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

2024-04-29 12:13:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为有以下逻辑:

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

其中UploadFileForm等于:

class UploadFileForm(forms.Form):
    file = forms.FileField()

我正在尝试为此视图编写单元测试。在Django docs中,建议的方法是:

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

我的目标是让uploadform.isu valid()计算为True,这样我就可以测试表单验证之后的代码。当我运行上面的测试时,uploadform.is_valid()的计算结果为False。我有什么遗漏吗?测试中的代码是将文件添加到request.FILES中,还是在执行其他操作?


Tags: testselfclientifisrequestdeffiles
3条回答

也许我遗漏了一些东西,但听起来像是一个很好的模拟图书馆的工作。我个人非常喜欢Mock。但是,我陷入了这样一个阵营:认为单元测试应该不受所有外部依赖关系的影响(比如在某个位置必须有一个名为“file.csv”的文件,等等)

在文档中,文件字段称为attachment,但在您的文档中,它称为file

您也不需要在post数据中使用name,它指的是另一个名为name的字段,而不是您正在上载的文件的名称。

请尝试以下操作:

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

django的测试套件的工作方式是:

from django.core.files.uploadedfile import SimpleUploadedFile
f = SimpleUploadedFile("file.txt", b"file_content")

这样你就不需要创建一个临时文件并写入它,也不需要模拟一个文件(不像听起来那么简单)。

相关问题 更多 >