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

时间:2018-03-14 05:48:49

标签: django validation testing django-rest-framework serializer

我认为我有两种方法可以测试drf序列化器验证

以下是我的序列化验证码

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

它是测试代码

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)

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)

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

和......我练习测试驱动的编码。是否有必要编写如上所述的测试代码

1 个答案:

答案 0 :(得分:0)

第一种方法实际上不测试序列化程序类。它正在测试整个'apk-list'端点。由于错误可能不仅在序列化程序的validate_md5方法中引发,而且在任何其他地方,即使将传递self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST),您也无法确定序列化程序是否按预期工作。 所以第二种方法是优先考虑的。但是在一个测试用例中你不是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)

<强> 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')