用FileFieldtestingDjango表单

我有一个表格,如:

#forms.py from django import forms class MyForm(forms.Form): title = forms.CharField() file = forms.FileField() #tests.py from django.test import TestCase from forms import MyForm class FormTestCase(TestCase) def test_form(self): upload_file = open('path/to/file', 'r') post_dict = {'title': 'Test Title'} file_dict = {} #?????? form = MyForm(post_dict, file_dict) self.assertTrue(form.is_valid()) 

如何构造file_dict来将upload_file传递给表单?

到目前为止,我已经find了这个方法

 from django.core.files.uploadedfile import SimpleUploadedFile ... def test_form(self): upload_file = open('path/to/file', 'rb') post_dict = {'title': 'Test Title'} file_dict = {'file': SimpleUploadedFile(upload_file.name, upload_file.read())} form = MyForm(post_dict, file_dict) self.assertTrue(form.is_valid()) 

可能是这不是很正确,但我使用StringIO在unit testing中创build图像文件:

 imgfile = StringIO('GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' '\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;') imgfile.name = 'test_img_file.gif' response = self.client.post(url, {'file': imgfile}) 

这是另一种不需要使用实际图像的方法。

 from PIL import Image from StringIO import StringIO # Python 3: from io import StringIO from django.core.files.uploadedfile import InMemoryUploadedFile ... def test_form(self): im = Image.new(mode='RGB', size=(200, 200)) # create a new image using PIL im_io = StringIO() # a StringIO object for saving image im.save(im_io, 'JPEG') # save the image to im_io im_io.seek(0) # seek to the beginning image = InMemoryUploadedFile( im_io, None, 'random-name.jpg', 'image/jpeg', im_io.len, None ) post_dict = {'title': 'Test Title'} file_dict = {'picture': image} form = MyForm(data=post_dict, files=file_dict)