我认为我有两种方法可以测试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)
什么比另一个更好? 还是有最好的解决方案?
和......我练习测试驱动的编码。是否有必要编写如上所述的测试代码
答案 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')