"""pytest fixtures""" import pytest from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import StaticPool from app.core.database import Base, get_db from app.main import app as fastapi_app from app.services.seed import seed_if_empty import app.models # noqa: F401 — register metadata @pytest.fixture() def db_session(): """独立内存库会话,供种子与模型测试使用。""" engine = create_engine( "sqlite+pysqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, ) Base.metadata.create_all(bind=engine) TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) session = TestingSessionLocal() try: yield session finally: session.close() Base.metadata.drop_all(bind=engine) engine.dispose() @pytest.fixture() def client(): """已建表并种子的 TestClient(覆盖 get_db)。""" engine = create_engine( "sqlite+pysqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, ) Base.metadata.create_all(bind=engine) TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) session = TestingSessionLocal() seed_if_empty(session) def _override_get_db(): try: yield session finally: pass fastapi_app.dependency_overrides[get_db] = _override_get_db with TestClient(fastapi_app) as c: yield c fastapi_app.dependency_overrides.clear() session.close() Base.metadata.drop_all(bind=engine) engine.dispose()