Я хочу протестировать свою конечную точку GraphQL. Для этого мне придется издеваться над базой данных.
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlalchemy.ext.asyncio import create_async_engine
from contextlib import asynccontextmanager
import os
class Database:
def __init__(self) -> None:
self.engine = None
def connect(self) -> None:
if not self.engine:
self.engine = create_async_engine(os.environ.get("DATABASE_URL", "sqlite:///db.sqlite")
)
else:
raise ConnectionAbortedError("Database is already connected")
@asynccontextmanager
async def get_async_session(self):
if not self.engine:
raise ConnectionError("Database is not connected")
async with AsyncSession(self.engine) as session:
try:
yield session
finally:
await session.close()
Я пытался имитировать create_engine в своем тесте,
async def test_register_user_mutation(self, gql_schema: Schema, engine):
with patch("sqlmodel.create_engine") as mock_create_engine:
mock_create_engine.return_value = engine
в приложении
@pytest.fixture(scope="session", autouse=True)
def app() -> FastAPI:
engine = create_engine(
"sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool
)
SQLModel.metadata.create_all(engine)
with patch("sqlmodel.create_engine") as mock_create_engine:
mock_create_engine.return_value = engine
from daytistics.main import app
return app
и мне придется издеваться над сеансом
async def test_register_user_mutation(self, gql_schema: Schema, engine):
with patch("sqlmodel.Session", autospec=True) as mock_session_class:
mock_session_class.return_value = Session(engine)
но каждый раз оно записывалось в рабочую базу данных.
Не знаю, полезно ли это, но это моя фабрика приложений:
р>
def create_app() -> FastAPI:
dotenv.load_dotenv()
app = FastAPI()
register_dependencies()
with container.sync_context() as ctx:
db = ctx.resolve(Database)
db.connect()
graphql_router = create_graphql_router()
app.include_router(graphql_router, prefix="/graphql")
return app
app = create_app()
Обновление:
Я пытался использовать обезьяний патч, но он тоже не сработал:
@pytest.fixture(scope="function")
async def mock_db(monkeypatch):
test_engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
future=True,
connect_args={"check_same_thread": False},
)
async with test_engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
def mock_connect(self):
self.engine = test_engine
@asynccontextmanager
async def mock_get_async_session(self):
async with AsyncSession(test_engine) as session:
try:
yield session
finally:
await session.close()
monkeypatch.setattr(Database, "connect", mock_connect)
monkeypatch.setattr(Database, "get_async_session", mock_get_async_session)
return test_engine
Подробнее здесь: https://stackoverflow.com/questions/792 ... el-fastapi
Как имитировать базу данных (SQLModel + FastAPI) ⇐ Python
Программы на Python
-
Anonymous
1734232145
Anonymous
Я хочу протестировать свою конечную точку GraphQL. Для этого мне придется издеваться над базой данных.
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlalchemy.ext.asyncio import create_async_engine
from contextlib import asynccontextmanager
import os
class Database:
def __init__(self) -> None:
self.engine = None
def connect(self) -> None:
if not self.engine:
self.engine = create_async_engine(os.environ.get("DATABASE_URL", "sqlite:///db.sqlite")
)
else:
raise ConnectionAbortedError("Database is already connected")
@asynccontextmanager
async def get_async_session(self):
if not self.engine:
raise ConnectionError("Database is not connected")
async with AsyncSession(self.engine) as session:
try:
yield session
finally:
await session.close()
Я пытался имитировать create_engine в своем тесте,
async def test_register_user_mutation(self, gql_schema: Schema, engine):
with patch("sqlmodel.create_engine") as mock_create_engine:
mock_create_engine.return_value = engine
в приложении
@pytest.fixture(scope="session", autouse=True)
def app() -> FastAPI:
engine = create_engine(
"sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool
)
SQLModel.metadata.create_all(engine)
with patch("sqlmodel.create_engine") as mock_create_engine:
mock_create_engine.return_value = engine
from daytistics.main import app
return app
и мне придется издеваться над сеансом
async def test_register_user_mutation(self, gql_schema: Schema, engine):
with patch("sqlmodel.Session", autospec=True) as mock_session_class:
mock_session_class.return_value = Session(engine)
но каждый раз оно записывалось в рабочую базу данных.
Не знаю, полезно ли это, но это моя фабрика приложений:
р>
def create_app() -> FastAPI:
dotenv.load_dotenv()
app = FastAPI()
register_dependencies()
with container.sync_context() as ctx:
db = ctx.resolve(Database)
db.connect()
graphql_router = create_graphql_router()
app.include_router(graphql_router, prefix="/graphql")
return app
app = create_app()
[b]Обновление:[/b]
Я пытался использовать обезьяний патч, но он тоже не сработал:
@pytest.fixture(scope="function")
async def mock_db(monkeypatch):
test_engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
future=True,
connect_args={"check_same_thread": False},
)
async with test_engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
def mock_connect(self):
self.engine = test_engine
@asynccontextmanager
async def mock_get_async_session(self):
async with AsyncSession(test_engine) as session:
try:
yield session
finally:
await session.close()
monkeypatch.setattr(Database, "connect", mock_connect)
monkeypatch.setattr(Database, "get_async_session", mock_get_async_session)
return test_engine
Подробнее здесь: [url]https://stackoverflow.com/questions/79280371/how-to-mock-the-database-sqlmodel-fastapi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия