Транзакция Pytest-django не фиксируется в БД физически

Существует файл conftest.py, который позволяет мне использовать мое пользовательское транзакционное приспособление fake_user

@pytest.mark.django_db(transaction=True)
@pytest.fixture
def fake_user():
    user = getattr(fake_user, 'user', None)
    if user is None:
        user_data = dict(
            id=1,
            is_superuser=False,
            is_staff=False,
            email='foo@barmail.com', 
            username='foobaruser',
            password='passwordmaster',
            date_joined=timezone.now()
        )
        user = User.objects.create(
            **user_data
        )
        user.save()
        # pdb.set_trace()
        fake_user.user = user
    yield user

Как-то, если я отлаживаю с помощью pdb.set_trace() вышеприведенный код, я получаю User.objects.all() равный <QuerySet [<User: foobaruser>]>. Однако реальных тестовых записей в БД нет. Поэтому при запросе объектов "User" в другой высокоуровневой функции, например, "GraphQL" или REST вызове, я получаю абсолютно пустую таблицу "Users". Как я могу включить реальные транзакции тестовой БД? Почему pytest не допускает никаких физических записей или что препятствует их вставке?

Pytest очищает базу данных тестов между запусками; добавьте --reuse-db к вашим опциям, чтобы сохранить данные.

Что действительно помогло мне:
Это использование django_db_blocker: https://pytest-django.readthedocs.io/en/latest/database.html#randomize-database-sequences
. После вставки пользователя таким образом:

@pytest.fixture(scope='session')
def fake_user(django_db_setup, django_db_blocker):
    user = getattr(fake_user, 'user', None)
    if user is None:
        user_data = dict(
            id=1,
            is_superuser=False,
            is_staff=False,
            email='foo@barmail.com', 
            username='foobaruser',
            password='passwordmaster',
            date_joined=timezone.now()
        )
        with django_db_blocker.unblock():
            user = User.objects.create(
                **user_data
            )
        fake_user.user = user
    yield user

данные появились в Postgres. Спасибо!

Вернуться на верх