Транзакция 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. Спасибо!