python - 如何对 ValidationError 进行单元测试并断言使用了正确的代码?
问题描述
我有一个有ValidationError
约束的模型:
class MyModel(models.Model)
title = models.CharField()
def clean(self):
error_dict = {}
if self.title='invalid_title':
error_dict['title'] = ValidationError(
'Title is invalid', code='invalid_title_code')
if error_dict:
raise ValidationError(error_dict)
我想对此进行单元ValidationError
测试,但是如何测试它code
是否正确?例如:
def test_title_invalid(self):
with self.assertRaises(ValidationError) as cm:
MyModel.objects.create(title='invalid_title')
exception = cm.exception
# Test the key exists
self.assertTrue(hasattr(exception, 'error_dict'))
self.assertIn('title', exception.error_dict)
# Test the message exists
self.assertIn('Title is invalid', exception.messages)
# Test the code exists
self.assertIn('invalid_title_code', exception.code)
这一切都可以正常工作,直到self.assertIn('invalid_title_code', exception.code)
,这导致AttributeError
状态'ValidationError' object has no attribute 'code'
在 django 源代码django.core.exceptions.ValidationError
中,如果您传递一个dict
对象,则不会添加 code 属性:
class ValidationError(Exception):
"""An error while validating data."""
def __init__(self, message, code=None, params=None):
super().__init__(message, code, params)
if isinstance(message, dict):
self.error_dict = {}
for field, messages in message.items():
if not isinstance(messages, ValidationError):
messages = ValidationError(messages)
self.error_dict[field] = messages.error_list
else:
self.message = message
self.code = code
self.params = params
self.error_list = [self]
这是问题的原因吗?
解决方案
这是一个嵌套异常,您可以通过以下方式访问它:
exception = cm.exception
self.assertTrue(hasattr(exception, 'error_dict'))
self.assertIn('title', exception.error_dict)
title_exceptions = exception.error_dict['title']
self.assertEqual(1, len(title_exceptions))
title_exception = title_exceptions[0]
self.assertEqual('invalid_title_code', title_exception.code)
推荐阅读
- angular - 使用角度从arraylist更新firebase
- apache-nifi - Apache Nifi - 拆分数组并格式化为 JSON?
- python - Python Selenium 从父级拉取子级属性?
- docker - 结合 VOLUME + docker run -v
- javascript - 如何使用按钮生成不同的颜色
- python - Pygame 块精灵未在屏幕上绘制
- swift - Appcode 链接方法缩进与 xcode 缩进不匹配
- javascript - 使用 lambda 表达式的可迭代函数
- javascript - Chrome中立体声的SIP.js SimpleUser,如何?
- scikit-learn - ValueError:估计器 LogisticRegressionCV 的参数 C 无效