django DRF测试多个图像上传

pbwdgjma  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(119)

我试图测试多个图像上传到我的服务器。下面是序列化器:

class ImageSerializer(serializers.ModelSerializer):
    image = serializers.ListField(
        child=serializers.ImageField(allow_empty_file=True)
    )

字符串
ImageFactory:

def get_image():
    image = Image.new("RGB", (2000, 2000))
    file = tempfile.NamedTemporaryFile(suffix=".jpg")
    image.save(file)
    return file


试验项目:

def test_upload_multiple_images(self):
      self.image = get_image()
      with open(self.image.name, "rb") as file:
        payload = {
            "image": [file, file]
        }
        response = self.client.post(
            reverse("gallery-list", args=[self.item.pk]),
            data=payload,
            format="multipart"
        )


通过Postman进行测试时,阵列中的图像会正确保存。然而,当使用测试用例时,我从响应中得到以下消息:

{'image': [{'message': 'The submitted file is empty.', 'code': 'empty'}]}


在添加 allow_empty_file=True 之前,返回了两条消息。有人知道为什么会这样吗?

hmmo2u0o

hmmo2u0o1#

这里的问题是,您将同一个Image对象发送到数据库并保存两次。一旦第一个Image对象被解码为要保存在数据库中的文件,Image对象将变得不可读,并且由于它与第二个对象相同,因此将抛出错误。
因此,如果您将相同的Image对象作为两个不同的项目发送,则只有第一个项目是可读的。为了避免这种情况,您必须发送两个不同的图像对象。
您的ImageFactory可以重构为:

def get_image(count=1):
    images = []
    for i in range(count):
        file = io.BytesIO()
        image = Image.new('RGBA', size=(100, 100), color=(155, 0, 0))
        image.save(file, 'png')
        file.name = 'test.png'
        file.seek(0)
        images.append(file)
    return images[0] if count == 1 else images

字符串
你的测试:

def test_upload_multiple_images(self):
    self.images = get_image(2)
    payload = {
        "image": self.images
    }
    response = self.client.post(
        reverse("gallery-list", args=[self.item.pk]),
        data=payload,
        format="multipart"
    )

相关问题