首页 > 解决方案 > 如何在 Django REST Framework 中测试 ValidationError 消息?

问题描述

在尝试测试传递给Serializer的数据时,我不仅要测试错误消息本身,还要测试ValidationError错误消息本身。我目前使用它的方式检查 中的字段名称serializer.errors,但我正在寻找测试"Reformat your question please.". 这样做的干净方法是什么?

测试.py


class TestQuestionSerializer(TestCase):
    '''Verify that when an invalid question is 
    submitted that a validation error is raised'''

    @classmethod
    def setUpTestData(cls):
        cls.client_data = {
            "invalid": {
                "title": "Can I post a question?"
            },
            "valid": {
                "title": "How can I post a question?"
            }
        }

    def test_question_serializer_fail(self):
        with self.assertRaises(ValidationError) as e:
            serializer = QuestionSerializer(data=self.client_data['invalid'])
            serializer.is_valid(raise_exception=True)
        self.assertIn("title", serializer.errors)

序列化程序.py

class QuestionSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=50)

    def validate_title(self, value):
        regex = r"^[What|When|Where|How|Why]"
        match = re.search(regex, value)
        if not match:
            raise serializers.ValidationError("Reformat your question please.")
        return value


    def create(self, validated_data):
        return Question.objects.create(**validated_data)

标签: pythondjangodjango-rest-framework

解决方案


您可以使用assertRaisesMessage. 您的测试将如下所示,然后

def test_question_serializer_fail(self):
    with self.assertRaisesMessage(ValidationError, "Reformat your question please."):
        serializer = QuestionSerializer(data=self.client_data['invalid'])
        serializer.is_valid(raise_exception=True).

推荐阅读