Python 如何对ValidationError进行单元测试并断言使用了正确的代码?

Python 如何对ValidationError进行单元测试并断言使用了正确的代码?,python,django,python-unittest,django-testing,django-tests,Python,Django,Python Unittest,Django Testing,Django Tests,我有一个带有ValidationError约束的模型: class MyModel(models.Model) title = models.CharField() def clean(self): error_dict = {} if self.title='invalid_title': error_dict['title'] = 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)
我想联合测试此
验证错误
,但如何测试
代码
是否正确?例如:

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'对象没有属性“code”

django.core.exceptions.ValidationError
的django源代码中,如果传递
dict
对象,则似乎不会添加代码属性:

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)
exception=cm.exception
assertTrue(hasattr(异常,'error\u dict'))
self.assertIn('title',exception.error\u dict)
title\u exceptions=异常。错误\u dict['title']
自评资格(1,len(标题和例外))
title\u exception=title\u exception[0]

self.assertEqual('invalid\u title\u code',title\u exception.code)
title\u exceptions[0]
显示一个
键错误。
title\u exceptions
repr
{'title':[ValidationError(['title is invalid'])}
,它似乎没有嵌套?@alias51:很抱歉出错,应该是
title\u exceptions=exception.error\u dict['title']