如何对 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']
        )