Override FastAPI dependencies in tests to use in-memory SQLite instead of the real database.
Advanced FastAPI Testing
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.main import app
from app.database import Base, get_db
engine = create_engine("sqlite:///./test.db",
connect_args={"check_same_thread": False})
TestSession = sessionmaker(bind=engine)
@pytest.fixture(autouse=True)
def setup_db():
Base.metadata.create_all(bind=engine)
yield
Base.metadata.drop_all(bind=engine)
@pytest.fixture
def client():
session = TestSession()
app.dependency_overrides[get_db] = lambda: session
with TestClient(app) as c: yield c
app.dependency_overrides.clear()
session.close()
def test_create_user(client):
resp = client.post("/users",
json={"name":"Alice",
"email":"a@test.com",
"password":"Secret1!"})
assert resp.status_code == 201
def test_missing_user(client):
assert client.get("/users/99999").status_code == 404