Как проверить, что именованный CheckConstraint или ValidationError возникает в модульных тестах? - PullRequest
1 голос
/ 11 июля 2020

Я тестирую проверки и проверяю ограничения на моей модели:

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'] поднят?

1 Ответ

1 голос
/ 11 июля 2020

Вы можете получить ссылку на исключение, а затем продолжить проверку:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...