cms*_*mgr 4 forms django validation django-tests django-1.7
我正在使用 Django 1.7 和 Python 3.4 编写单元测试。当file_data元素被注释掉时,下面的表单验证正常。随着file_data包括它不验证和测试失败。
from django.core.files.uploadedfile import SimpleUploadedFile
...
data = {
'phone_number': '123456',
'job': Job.objects.latest('id').pk,
}
file_data = {
'portrait': SimpleUploadedFile(
content=b'',
content_type='image/jpeg',
name='test.jpg',
)
}
form = PersonForm(data, file_data)
self.assertTrue(form.is_valid())
Run Code Online (Sandbox Code Playgroud)
类似的代码适用FileField于我网站其他地方的上传测试。在 shell 中运行代码我得到以下内容form.errors:'Upload a valid image. The file you uploaded was either not an image or a corrupted image.'因此,我认为问题出在content或content_type字段中。我试过在这个答案中使用 image-as-a-string无济于事。[编辑:图像作为字符串的方法实际上是答案,但我一定是实施得很糟糕。接受的答案已验证有效。]我在SimpleUloadedFile 源代码中找不到任何线索。
该表单在现实中运行良好,但我想确保它包含在未来维护的工作测试中。理想情况下,我想避免必须存在实际test.jpg文件,因为图像在我的.gitignore文件中,我不想开始破解目前非常流畅的自动部署。
我应该提供什么输入才能SimpleUploadedFile正确验证?
Image在您的测试套件和您的工作代码之间运行lib有什么区别吗?Imagelib可以正确处理GIF等文件吗?您可能还需要检查PIL/pillow安装。
SimpleUploadedFile(name='foo.gif',
content=b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00')
Run Code Online (Sandbox Code Playgroud)
为我工作。
表单内部依赖于forms.ImageField在其 中测试图像,to_python()方式如下:
import io
from django.utils.image import Image
Image.open(io.BytesIO(image_content)).verify()
Run Code Online (Sandbox Code Playgroud)
该verify()行的任何异常都会导致错误'Upload a valid image...'。您可以通过将其分配给来检查图像字节image_content:
image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00'
Run Code Online (Sandbox Code Playgroud)
也适合我。
此外,您可以在线生成图像字节:
import io
from django.utils.image import Image
fp = io.BytesIO()
Image.new('P', (1,1)).save(fp, 'png')
fp.seek(0)
portrait = SimpleUploadedFile(name=''foo, content=fp.read())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |