如何对 Django Rest Framework 序列化程序的创建方法进行单元测试?
How to UnitTest Django Rest Framework Serializers's create method?
如何测试create method of serializer
?
现场水平
您可以通过将 .validate_ 方法添加到您的 Serializer subclass 来指定自定义字段级验证。这些类似于 Django 表单上的 .clean_ 方法。
这些方法采用单个参数,即需要验证的字段值。
您的 validate_ 方法应该 return 验证值或引发 serializers.ValidationError。例如:
from rest_framework import serializers
class BlogPostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
content = serializers.CharField()
def validate_title(self, value):
"""
Check that the blog post is about Django.
"""
if 'django' not in value.lower():
raise serializers.ValidationError("Blog post is not about Django")
return value
对象级验证
要执行需要访问多个字段的任何其他验证,请将名为 .validate() 的方法添加到您的 Serializer subclass。此方法采用单个参数,即字段值字典。如有必要,它应该引发 serializers.ValidationError,或者只是 return 验证值。例如:
from rest_framework import serializers
class EventSerializer(serializers.Serializer):
description = serializers.CharField(max_length=100)
start = serializers.DateTimeField()
finish = serializers.DateTimeField()
def validate(self, data):
"""
Check that start is before finish.
"""
if data['start'] > data['finish']:
raise serializers.ValidationError("finish must occur after start")
return data
验证者
序列化器上的各个字段可以包含验证器,方法是在字段实例上声明它们,例如:
def multiple_of_ten(value):
if value % 10 != 0:
raise serializers.ValidationError('Not a multiple of ten')
class GameRecord(serializers.Serializer):
score = IntegerField(validators=[multiple_of_ten])
...
Serializer classes 还可以包括应用于完整字段数据集的可重用验证器。这些验证器通过在内部 Meta class 上声明它们来包含,如下所示:
class EventSerializer(serializers.Serializer):
name = serializers.CharField()
room_number = serializers.IntegerField(choices=[101, 102, 103, 201])
date = serializers.DateField()
class Meta:
# Each room only has one event per day.
validators = UniqueTogetherValidator(
queryset=Event.objects.all(),
fields=['room_number', 'date']
)
如何测试create method of serializer
?
现场水平
您可以通过将 .validate_ 方法添加到您的 Serializer subclass 来指定自定义字段级验证。这些类似于 Django 表单上的 .clean_ 方法。
这些方法采用单个参数,即需要验证的字段值。
您的 validate_ 方法应该 return 验证值或引发 serializers.ValidationError。例如:
from rest_framework import serializers
class BlogPostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
content = serializers.CharField()
def validate_title(self, value):
"""
Check that the blog post is about Django.
"""
if 'django' not in value.lower():
raise serializers.ValidationError("Blog post is not about Django")
return value
对象级验证
要执行需要访问多个字段的任何其他验证,请将名为 .validate() 的方法添加到您的 Serializer subclass。此方法采用单个参数,即字段值字典。如有必要,它应该引发 serializers.ValidationError,或者只是 return 验证值。例如:
from rest_framework import serializers
class EventSerializer(serializers.Serializer):
description = serializers.CharField(max_length=100)
start = serializers.DateTimeField()
finish = serializers.DateTimeField()
def validate(self, data):
"""
Check that start is before finish.
"""
if data['start'] > data['finish']:
raise serializers.ValidationError("finish must occur after start")
return data
验证者
序列化器上的各个字段可以包含验证器,方法是在字段实例上声明它们,例如:
def multiple_of_ten(value):
if value % 10 != 0:
raise serializers.ValidationError('Not a multiple of ten')
class GameRecord(serializers.Serializer):
score = IntegerField(validators=[multiple_of_ten])
...
Serializer classes 还可以包括应用于完整字段数据集的可重用验证器。这些验证器通过在内部 Meta class 上声明它们来包含,如下所示:
class EventSerializer(serializers.Serializer):
name = serializers.CharField()
room_number = serializers.IntegerField(choices=[101, 102, 103, 201])
date = serializers.DateField()
class Meta:
# Each room only has one event per day.
validators = UniqueTogetherValidator(
queryset=Event.objects.all(),
fields=['room_number', 'date']
)