Django 测试表单时模拟文件数据的正确方法是什么?
我正在尝试测试一个自编的FormField AudioFileFormField,它在存储文件之前检查文件是否是音频文件。为此,我覆盖了to_python方法。试图测试这个FormField,我遇到了一些困难 这是到目前为止我的测试用例:Django 测试表单时模拟文件数据的正确方法是什么?,django,django-forms,django-file-upload,Django,Django Forms,Django File Upload,我正在尝试测试一个自编的FormField AudioFileFormField,它在存储文件之前检查文件是否是音频文件。为此,我覆盖了to_python方法。试图测试这个FormField,我遇到了一些困难 这是到目前为止我的测试用例: from django import forms from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase class Tes
from django import forms
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase
class TestAudioFileFormField(TestCase):
""" test the formfield to use for AudioFile Uploads """
class TestForm(forms.Form):
audiofilefield = AudioFileFormField()
def setUp(self):
self.AUDIOFILE_TEST_ROOT = os.path.dirname(__file__) + '/data/'
self.files = audiofile_files
def test_to_python(self):
""" assign some files to a form and validate the form """
f = file(self.AUDIOFILE_TEST_ROOT + self.files[0])
file_data = {'audiofilefield':SimpleUploadedFile( self.files[0],f.read() )}
data = {}
form = self.TestForm(data,f)
form.is_valid()
line form.is_valid()引发AttributeError:“file”对象没有属性“get”
当我在form.is\u valid()之前插入调试跟踪时,这是我在该交互式会话中得到的结果:
ipdb> form.is_valid()
AttributeError: 'file' object has no attribute 'get'
ipdb> suf = file_data['audiofilefield']
ipdb> suf
<SimpleUploadedFile: invalid_format.mp3 (text/plain)>
ipdb> dir(suf)
[lots of info here]
ipdb> form.is_valid()
True
ipdb>form.u是否有效()
AttributeError:“文件”对象没有属性“get”
ipdb>suf=文件数据['audiofilefield']
ipdb>suf
ipdb>dir(suf)
[这里有很多信息]
ipdb>form.u是否有效()
真的
我在交互式会话中到底做了哪些更改,以便表单验证能够正常工作?将文件传递给SimpleUploadedFile以避免AttributeError的正确方法是什么?好的,一个全新的外观会很有价值。这是我新的test-to-python测试,这次它可以工作了:
def test_to_python(self):
f = file(self.AUDIOFILE_TEST_ROOT + self.files[0])
file_data = {'audiofilefield':SimpleUploadedFile(self.files[0],f.read())}
data = {}
form = self.TestForm(data,file_data)
self.assertTrue( form.is_valid() )
替代解决方案(因为这个问题是“Django test simulate upload”(Django测试模拟上传)的Google最佳结果):Django的内置测试客户端接受打开的文件对象作为POST数据:
# the form
class TestForm(forms.Form):
audiofilefield = AudioFileFormField()
# the view
def upload_view(request):
form = TestForm(data=request.POST or None, files=request.FILES or None)
if request.method == 'POST':
if form.is_valid():
return HttpResponse('success')
else:
return HttpResponse('fail')
# the test function
class UploadTest(TestCase):
def test_upload(self):
c = Client() # django.test.client.Client
formdata = {}
with open('/my/audiofile.mp3', 'rb') as f:
formdata['audiofilefield'] = f
response = c.post('/my-test-view/', formdata)
你不觉得这会污染你的
上传/
目录吗?