提问人:Rauf Masoumi 提问时间:11/16/2023 最后编辑:Rauf Masoumi 更新时间:11/18/2023 访问量:30
如何在 Django Rest 中测试嵌套序列化程序?
How to test nested Serializers in Django Rest?
问:
我有一个 ToDo App Django 项目,因此有 Task 和 TaskList 模型,它们与 ManyToMany 关系链接。 在我的 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内没有任务列表字段。(发送并验证标题字段)
我猜渲染器和json_encoder对这种类型的数据有问题。
那么,正确的请求数据应该如何放在嵌套的序列化程序测试中呢?
一般来说,如何测试嵌套序列化程序!
答:
在 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 并指定方法中的内容类型,可以确保以序列化程序的正确格式发送数据。json.dumps
'application/json'
put
此外,在测试嵌套序列化程序时,请确保发送的数据正确无误,并遵循序列化程序预期的结构。在您的例子中,字典中的字段应与嵌套序列化程序预期的结构匹配,该序列化程序是带有键的字典列表。tasklists
data
"pk"
如果问题仍然存在,您可能需要检查视图和序列化程序代码,以确保正确定义嵌套序列化程序并按预期处理数据。您还可以在测试期间在视图中打印或记录接收到的内容,以检查正在接收和处理的内容。data
请记住,测试嵌套序列化程序涉及确保测试请求中发送的数据格式正确,并且在序列化程序和视图中正确处理嵌套关系。
评论