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)
有什么比另一个更好的?还是有最好的解决方案?
我练习测试驱动的编码 是否需要编写上述测试代码
第一种方法实际上不测试序列化程序类。它正在测试整个'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)
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |