测试Drf序列化程序验证的最佳方法是什么

fuz*_*zes 4 testing django validation serializer django-rest-framework

我认为两种方法可以测试Drf序列化程序验证

以下是我的序列化器验证代码

def validate_md5(self, md5):
    if len(md5) != 40:
        raise serializers.ValidationError("Wrong md5")
    return md5
Run Code Online (Sandbox Code Playgroud)

这是测试代码

1)

def test_wrong_validate_md5_2(self):
    url = reverse('apk-list')
    response = self.client.post(url, {'md5':'test'}, format='json')
    self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

2)

def test_wrong_validate_md5(self):
    serializer = ApkSerializer(data=self.apk)

    if len(self.apk.get('md5')) != 40:
        self.assertEqual(serializer.is_valid(), False)
    else:
        self.assertEqual(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)

有什么比另一个更好的?还是有最好的解决方案?

我练习测试驱动的编码 是否需要编写上述测试代码

nev*_*ner 5

第一种方法实际上不测试序列化程序类。它正在测试整个'apk-list'端点。由于不仅可能会在串行化器的validate_md5方法中引发错误,而且即使self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)通过了传递,也会在其他任何地方引发错误,因此您无法确定串行器是否按预期工作。所以第二种方法是preferabe。但是最好不要if/else创建两个不同的测试用例:一个用于正确的数据,另一个用于不正确的用例,还可以检查是否与md5字段相关的错误实例:

def test_wrong_validate_md5(self):
    serializer = ApkSerializer(data=self.apk_wrong)
    self.assertEqual(serializer.is_valid(), False)
    self.assertEqual(set(serializer.errors.keys()), set(['md5']))

def test_correct_validate_md5(self):
    serializer = ApkSerializer(data=self.apk_correct)
    self.assertEqual(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)

UPD

也可以使用第一种方法,但是在这种情况下,您需要解析响应数据。并检查此数据是否包含带有“ md5”键的错误,例如:

def test_wrong_validate_md5_2(self):
    url = reverse('apk-list')
    response = self.client.post(url, {'md5':'test'}, format='json')
    self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
    self.assertEqual(response.data,{'md5': Wrong md5')
Run Code Online (Sandbox Code Playgroud)