如何在 Django Rest 中测试嵌套序列化器?

问题描述 投票:0回答:1

我有一个 ToDo App Django 项目,因此存在与 ManyToMany 关系链接的 Task 和 TaskList 模型。 在我的 TaskSerializer 中,我定义了一个嵌套的 TaskListSerializer,它处理任务的任务列表的反向关系。 现实世界中一切都很顺利,序列化和反序列化也没问题。

这是您在更新任务时应该发出的请求(作为 json):

{
    "title": "hello",
    "tasklists": [
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"},
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"}
    ]
}

但是在测试中,我想测试这个序列化器,并且当我发送放置请求时,任务列表字段不会发送到视图!

这是测试请求:

path = self.task.get_absolute_api_url()
data = {
    "title": "hello",
    "tasklists": [
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"},
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"}
    ]
}
self.client.put(path, data)

但是视图的validated_data和initial_data内部没有tasklists字段。(标题字段已发送并验证)

我猜想 Renderer 和 json_encoder 对于这种类型的数据有问题。

那么正确的请求数据应该如何包含在嵌套序列化器测试中?

一般来说,如何测试嵌套序列化器!

json django serialization django-rest-framework django-serializer
1个回答
0
投票

在 Django 中测试嵌套序列化器可能有点棘手,尤其是在处理 ManyToMany 关系时。要测试嵌套序列化器,您应该确保在测试请求中发送的数据格式正确,以符合序列化器的期望。

以下是修改测试请求数据以确保正确处理嵌套序列化器的方法:

path = self.task.get_absolute_api_url()
data = {
    "title": "hello",
    "tasklists": [
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"},
        {"pk": "b84d3375-0e09-4dd1-9809-f92d29d6aa36"}
    ]
}

# Convert the data to JSON since the Django test client sends JSON by default
json_data = json.dumps(data)

# Make the PUT request with the JSON data
self.client.put(path, json_data, content_type='application/json')

通过使用

json.dumps
将数据转换为 JSON 并在
'application/json'
方法中将内容类型指定为
put
,可以确保数据以正确的格式发送给序列化器。

此外,在测试嵌套序列化器时,请确保您发送的数据正确并且遵循序列化器期望的结构。在您的情况下,

tasklists
字典中的
data
字段应与嵌套序列化器所需的结构匹配,该结构是带有键
"pk"
的字典列表。

如果问题仍然存在,您可能需要检查视图和序列化器代码,以确保正确定义嵌套序列化器并按预期处理数据。您还可以打印或记录测试期间视图中收到的

data
,以检查正在接收和处理的内容。

请记住,测试嵌套序列化器涉及确保测试请求中发送的数据格式正确,并且在序列化器和视图中正确处理嵌套关系。

© www.soinside.com 2019 - 2024. All rights reserved.