当前位置: 首页 > 知识库问答 >
问题:

Django Rest Framework-单元测试图像文件上传

孟树
2023-03-14

我正在尝试单元测试我上传REST API的文件。我在网上找到了一些用Pillow生成图像的代码,但无法序列化。

这是我生成图像的代码:

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0))
file = BytesIO(image.tobytes())
file.name = 'test.png'
file.seek(0)

然后我尝试上载此图像填充:

return self.client.post("/api/images/", data=json.dumps({
     "image": file,
     "item": 1
}), content_type="application/json", format='multipart')

我得到以下错误:

<ContentFile: Raw content> is not JSON serializable

如何转换枕头图像使其可序列化?

共有2个答案

楮乐邦
2023-03-14

您将文件转换为字节,这是不可JSON序列化的。

在不知道您的API期望接收什么的情况下,我不得不猜测您必须将file编码为字符串:"image":file.decode('utf-8')

虽然有许多解决方案可以解决单元测试图像上传到REST API的一般问题

澹台新知
2023-03-14

在这种情况下,我不建议将数据作为JSON提交,因为这会使问题复杂化。只需使用要提交的参数和文件发出POST请求即可。Django REST框架可以很好地处理它,而无需将其序列化为JSON。

不久前,我编写了一个将文件上载到APIendpoint的测试,如下所示:

def test_post_photo(self):
    """
    Test trying to add a photo
    """
    # Create an album
    album = AlbumFactory(owner=self.user)

    # Log user in
    self.client.login(username=self.user.username, password='password')

    # Create image
    image = Image.new('RGB', (100, 100))
    tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
    image.save(tmp_file)

    # Send data
    with open(tmp_file.name, 'rb') as data:
        response = self.client.post(reverse('photo-list'), {'album': 'http://testserver/api/albums/' + album.pk, 'image': data}, format='multipart')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

在本例中,我使用tempfile模块来存储使用枕头生成的图像。示例中使用的with语法允许您相对容易地在请求正文中传递文件内容。

基于此,类似这样的内容应该适用于您的用例:

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0))
file = tempfile.NamedTemporaryFile(suffix='.png')
image.save(file)

with open(file.name, 'rb') as data:
    return self.client.post("/api/images/", {"image": data, "item": 1}, format='multipart')

顺便提一下,根据您的用例,将图像数据接受为基64编码字符串可能更方便。

 类似资料:
  • 问题内容: 我最近正在研究的程序中的一个常见任务是以某种方式修改文本文件。(嘿,我在Linux上。所有内容都是一个文件。我进行大规模的系统管理。) 但是代码修改的文件可能不存在于我的桌面盒中。而且,如果它在我的桌面上,我可能不想修改它。 我已经了解了Dive Into Python中的单元测试,并且很清楚我在测试将十进制转换为罗马数字的应用程序时想要做的事情(DintoP中的示例)。测试是完全独立

  • 问题内容: 我正在使用某些文件,并且想知道是否存在一种检查文件是否为图像的方法? 问题答案: 这对我来说很好。希望我能帮上忙

  • 当一个批处理任务写入数据库的时候,很容易去查询数据去验证结果是否如预期一样。然而,如果批处理任务写入一个文件,验证输出量同样重要。Spring Batch 提供了一个类AssertFile使输出文件的验证变得容易。assertFileEquals方法带了两个文件对象(或者是两个资源对象)和断言,一行一行的,两个文件有相同的上下文。因此,它可能创建了一个文件,有预期的输出和对比之后返回的真实结果:

  • 时常组件在运行的时候需要配置你的步骤使用步骤并且迟绑定注入上下文从步骤或者是任务执行。这些是机警的测试像单独的组件除非你有一个办法设置上下文就像他们在一个步骤里执行。那是两个组件的目标在spring batch中:StepScopeTestExecutionListener 和 StepScopeTestUtils 这个监听是公开的在类级别中,它的工作是创建一个步骤为每个测试方法执行上下文。例如:

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

  • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其