Django Model.objects.create () исключение БД не фильтруется - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь проверить проверку ограничений в Django с помощью модульного теста py.test, создав дочерний объект, для которого родительский объект не существует.

@pytest.mark.django_db
def test_child_with_missing_parent():
    with pytest.raises(django.db.utils.IntegrityError):
        Child.objects.create(parent_id=1337)

Исключение выдается, но не может быть перехвачено - оно просто отображается в stderr. Я сейчас использую pytest.mark.xfail, но фактически это просто "пропуск" - 1 xfailed, 1 xpassed - результат. Как я могу поймать такую ​​ошибку в ожидаемом сценарии, как это?

Вот исключение / ошибка, которая появляется в консоли, но не может быть перехвачена:

self = <django.db.backends.utils.CursorWrapper object at 0x7fe1e2dea5f8>, sql = 'SET CONSTRAINTS ALL IMMEDIATE', params = None
ignored_wrapper_args = (False, {'connection': <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7fe1ec724128>, 'cursor': <django.db.backends.utils.CursorWrapper object at 0x7fe1e2dea5f8>})

    def _execute(self, sql, params, *ignored_wrapper_args):
        self.db.validate_no_broken_transaction()
        with self.db.wrap_database_errors:
            if params is None:
>               return self.cursor.execute(sql)
E               psycopg2.IntegrityError: insert or update on table "myapp_child" violates foreign key constraint "myapp_re_parent_id_537da634_fk_myapp_calc"
E               DETAIL:  Key (parent_id)=(1337) is not present in table "myapp_parent".

/usr/local/lib/python3.6/site-packages/django/db/backends/utils.py:83: IntegrityError

The above exception was the direct cause of the following exception:

self = <django.test.testcases.TestCase testMethod=__init__>

1 Ответ

0 голосов
/ 03 июля 2018

Похоже, вы пытаетесь поймать другое исключение из того, что поднято. psycopg2.IntegrityError - это не то же самое, что django.db.utils.IntegrityError - и по какой-то причине Django не включает это исключение в свою собственную оболочку.

Это должно работать:

with pytest.raises(psycopg2.IntegrityError):
    Child.objects.create(parent_id=1337)
...