如何测试单元测试中引发的命名 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')

一切正常,但实际上我有多个 CheckConstraintsValidationErrors 用于不同的字段,所以我希望能够测试是否出现了正确的错误。

我如何测试一个名为 CheckConstrainttitle_cannot_be_word 被引发,或一个名为 ValidationErrorerror_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>