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

时间:2012-03-03 20:01:49

标签: python django unit-testing

我认为我有以下逻辑:

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文档,建议的方法是:

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

3 个答案:

答案 0 :(得分:36)

django的测试工具的方式是:

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

这样您就不需要创建临时文件并写入它,也不需要模拟文件(不像听起来那么容易)。

答案 1 :(得分:17)

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

您的帖子数据中不需要name - 引用另一个名为name的字段,而不是您要上传的文件的名称。

尝试以下方法:

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

答案 2 :(得分:3)

也许我在这里遗漏了一些东西,但听起来像是一个好的模拟库的工作。我个人非常喜欢Mock。但是,我进入营地,认为你的单元测试应该没有所有外部依赖(比如必须在某个位置有一个名为“file.csv”的文件等)。