https://www.core27.co/post/transactional-unit-tests-with-pytest-and-async-sqlalchemy
У тебя ещё сессия неправильно используется, тебе надо её открывать в скопе функции и там оверрайдить
Зачем в тестовой функции оверрайдить? Это ж куча повторяющегося когда
Я вот так вот писал, движок, приложение и фабрика сессий создаются со скоупом сессии тоже в фикстурах @asynccontextmanager async def test_session(session_factory, engine): # noqa connection = await engine.connect() trans = await connection.begin() async_session = session_factory(bind=connection) nested = await connection.begin_nested() @event.listens_for(async_session.sync_session, "after_transaction_end") def end_savepoint(session, transaction): nonlocal nested if not nested.is_active: nested = connection.sync_connection.begin_nested() yield async_session await trans.rollback() await async_session.close() await connection.close() @pytest_asyncio.fixture(scope="function") async def session( session_factory, engine, app, ) -> AsyncGenerator[AsyncSession, None]: """Get session and aquire after completion.""" async with test_session(session_factory, engine) as session: async def get_test_async_session(): yield session # runtime session sync for server and client app.dependency_overrides[get_session] = get_test_async_session yield session
Вот тут сессия в рантайме меняется чтоб можно было в кейсе её переиспользовать на одном уровне изоляции
Не проще ли подменить параметры подключения к БД на другие? Я сам пользуюсь оверайдом т.к. для тестирования функция session всегда в конце ролбек и клоусе делает. И в целом Я данные тестовые в сессию загоняю, и эту же сессию использую для теста методов репозитория. Т.е. методы гет, берут данные из сессии. По сути, коннекта к БД и не требуется.
Обсуждают сегодня