Django - 如何为 DRF ImageField 编写测试

msl*_*sln 1 django django-unittest django-rest-framework django-tests

我有以下序列化器:

from rest_framework.serializers import Serializer, ImageField

class MySerializer(Serializer):
    avatar = ImageField()
Run Code Online (Sandbox Code Playgroud)

我怎样才能为它编写单元测试?我使用了 Django TestCase,但它引发了一个错误。

from django.test import TestCase

class MySerializerTest(TestCase):

    def setUp(self):
        self.data = {}
        ...

    def test_image(self):
        import tempfile
        self.data['avatar'] = tempfile.NamedTemporaryFile(suffix=".jpg").file
        r_data = json.dumps(self.data)
        j_data = json.loads(r_data)
        serializer = MySerializer(data=j_data)
        if not serializer.is_valid():
            import pprint
            pprint.pprint(serializer.errors)
        self.assertEqual(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)

但它会引发以下错误:

TypeError:“BufferedRandom”类型的对象不可 JSON 序列化

我有什么错?如何为图像字段编写测试?

Dav*_*yan 5

我建议使用django 中的类并使用PillowSimpleUploadedFile包创建图像。请参阅下面的示例。

from PIL import Image

from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase
from django.utils.six import BytesIO


class MySerializerTest(TestCase):
    ...

    def test_image(self):
        image = BytesIO()
        Image.new('RGB', (100, 100)).save(image, 'JPEG')
        image.seek(0)

        self.data['avatar'] = SimpleUploadedFile('image.jpg', image.getvalue())
        serializer = MySerializer(data=self.data)
        self.assertEqual(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)