Wie kann ich die Datenbank verspotten?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie kann ich die Datenbank verspotten?

by Anonymous » 29 Jul 2025, 04:24

Ich möchte meinen GraphQL -Endpunkt testen. Dazu muss ich die Datenbank verspotten. < /P>

Code: Select all

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()
Ich habe versucht, in meinem Test zu create create_engine verspottet:

Code: Select all

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
In der App Fixture:

Code: Select all

@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
< /code>
und die Sitzung: < /p>
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)
< /code>
Aber jedes Mal, wenn sie in die Produktionsdatenbank geschrieben wurde.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()
< /code>
Ein MonkeyPatch funktionierte auch nicht: < /p>
@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

Top