如何测试单元测试中引发的命名 Check Constraint 或 ValidationError?
How to test a named CheckConstraint or ValidationError is raised in unittests?
我正在对我的模型进行单元测试验证和检查约束:
class MyModel(models.Model):
title = models.CharField()
class Meta:
models.CheckConstraint(
check=~Q(title='Word'),
name='title_cannot_be_word'
),
def clean(self):
error_dict = {}
if self.title == 'Word':
error_dict['title'] = 'Title can not be Word'
if error_dict:
raise ValidationError(error_dict)
在我的 tests.py:
def test_validation(self):
with self.assertRaises(ValidationError):
m = MyModel(title='Word')
m.clean()
def test_constraint(self):
with self.assertRaises(Integrity):
m = MyModel.objects.create(title='Word')
一切正常,但实际上我有多个 CheckConstraints
和 ValidationErrors
用于不同的字段,所以我希望能够测试是否出现了正确的错误。
我如何测试一个名为 CheckConstraint
的 title_cannot_be_word
被引发,或一个名为 ValidationError
的 error_dict['title']
被引发?
您可以获得对异常的引用,然后继续验证:
def test_validation(self):
with self.assertRaises(ValidationError) <b>as ex</b>:
m = MyModel(title='Word')
m.clean()
<b>exception = ex.exception</b>
self.assertTrue(hasattr(exception, 'error_dict'))
self.assertIn('title', exception.error_dict)
至于一个IntegrityError
,这个不包含任何字段,只是Exception
带参数。您可能想检查异常的名称是否在字符串表示中:
def test_constraint(self):
with self.assertRaises(Integrity) as ex:
MyModel.objects.create(title='Word')
exception = ex.exception
self.<b>assertIn(</b>'title_cannot_be_word', str(exception)<b>)</b>
我正在对我的模型进行单元测试验证和检查约束:
class MyModel(models.Model):
title = models.CharField()
class Meta:
models.CheckConstraint(
check=~Q(title='Word'),
name='title_cannot_be_word'
),
def clean(self):
error_dict = {}
if self.title == 'Word':
error_dict['title'] = 'Title can not be Word'
if error_dict:
raise ValidationError(error_dict)
在我的 tests.py:
def test_validation(self):
with self.assertRaises(ValidationError):
m = MyModel(title='Word')
m.clean()
def test_constraint(self):
with self.assertRaises(Integrity):
m = MyModel.objects.create(title='Word')
一切正常,但实际上我有多个 CheckConstraints
和 ValidationErrors
用于不同的字段,所以我希望能够测试是否出现了正确的错误。
我如何测试一个名为 CheckConstraint
的 title_cannot_be_word
被引发,或一个名为 ValidationError
的 error_dict['title']
被引发?
您可以获得对异常的引用,然后继续验证:
def test_validation(self):
with self.assertRaises(ValidationError) <b>as ex</b>:
m = MyModel(title='Word')
m.clean()
<b>exception = ex.exception</b>
self.assertTrue(hasattr(exception, 'error_dict'))
self.assertIn('title', exception.error_dict)
至于一个IntegrityError
,这个不包含任何字段,只是Exception
带参数。您可能想检查异常的名称是否在字符串表示中:
def test_constraint(self):
with self.assertRaises(Integrity) as ex:
MyModel.objects.create(title='Word')
exception = ex.exception
self.<b>assertIn(</b>'title_cannot_be_word', str(exception)<b>)</b>