我认为我有以下逻辑:
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,还是在做其他事情?
答案 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”的文件等)。