在 Django 单元测试中上传图片

4

我正在尝试在我的单元测试中将图像上传到ImageField,但无法弄清楚错误。

这是我的代码(在使用FileField的其他单元测试中,此代码可以正常工作):

request = self.factory.put(
    '/api/1.0/accounts/artlover/',
    {'profile_img': SimpleUploadedFile('foo.jpg', b'foo content')}
)
force_authenticate(request, self.artlover)
view = AccountViewSet.as_view({'put': 'update'})
resp = view(request, slug='artlover')
self.assertEqual(resp.status_code, 200)
self.assertFalse(resp.data.get('is_artist'))

收到这个错误。
Traceback (most recent call last):
File "/home/ben/aktweb/lib/python3.4/site-packages/PIL/ImageFile.py", line  100, in __init__
self._open()
File "/home/ben/aktweb/lib/python3.4/site-packages/PIL/TgaImagePlugin.py", line 62, in _open
depth = i8(s[16])
IndexError: index out of range

当我尝试使用真实图像时

img = ('/home/ben/aktweb/7.jpg')
with open(img) as infile:
    request = self.factory.put(
        '/api/1.0/accounts/artist/',
        {'profile_img': SimpleUploadedFile('7.jpg', infile.read())}
    )
    force_authenticate(request, self.artist)
    view = AccountViewSet.as_view({'put': 'update'})
    resp = view(request, slug='artist')
    self.assertEqual(resp.status_code, 200)
    self.assertTrue(resp.data.get('is_artist'))

以此结束。
Traceback (most recent call last):
File "/home/ben/aktweb/django/accounts/tests/test_views.py", line 163, in test_update
{'profile_img': SimpleUploadedFile('7.jpg', infile.read())}
File "/home/ben/aktweb/lib/python3.4/codecs.py", line 319, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
1个回答

3
  1. 使用二进制模式(b)打开图像文件:
  2. 将文件对象作为字典的值传递即可。

img = '/home/ben/aktweb/7.jpg'
with open(img, 'rb') as infile:
    request = self.factory.put(
        '/api/1.0/accounts/artist/',
        {'profile_img': infile}
    )
    ...

非常感谢!请提供能够与SimpleUploadedFile一起使用的代码。 - bboumend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接