Не могу понять, как правильно 'assert' для psycopg2.errors.NotNullViolation в Django
В настоящее время я создаю несколько тестов для созданной мной модели. Тест проверяет, работает ли ограничение first_name
NOT NULL для этого поля.
Для этого нужно проверить, не сработал ли метод object.save()
. Если он не работает, то утверждение должно возвращать pass.
Мой метод тестирования выглядит следующим образом:
def test_tutor_fname_notnull(self):
'''
Test passes if first_name NOT NULL constraint is working. If first_name is missing, data should not be saved to DB and return false.
'''
stevie = Tutors(last_name='wonder',email='sboywonder@gmail.com',birth_day='1990-01-02')
self.assertIs(stevie.save(), False)
Утверждение проваливается и возвращает следующее:
psycopg2.errors.NotNullViolation: null value in column "first_name" of relation "artsubjects_tutors" violates not-null constraint
DETAIL: Failing row contains (1, null, wonder, sboywonder@gmail.com, 1990-01-02).
Это означает, что ограничение NOT NULL работает и утверждение должно пройти. Но на самом деле утверждение не проходит.
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (errors=1)
Destroying test database for alias 'default'...
Есть идеи, как мне лучше обработать это утверждение, чтобы оно прошло как положено, когда метод object.save()
не сработал, как ожидалось?
Вы должны утверждать, что он вызывает ошибку, с .assertRaises(…)
[Python-doc]:
from psycopg2.errors import NotNullViolation
# …
def test_tutor_fname_notnull(self):
'''
Test passes if first_name NOT NULL constraint is working. If first_name is missing, data should not be saved to DB and return false.
'''
stevie = Tutors(last_name='wonder',email='sboywonder@gmail.com',birth_day='1990-01-02')
with self.assertRaises(NotNullViolation):
stevie.save()
Используя это как менеджер контекста (с ключевым словом with
), тест будет перехватывать NotNullViolation
, и позволит тесту завершиться неудачно, если такое исключение не возникнет.