Aislar pruebas con dependencias reemplazables
Objetivos
Vas a probar una ruta conectada a SQLAlchemy con datos pequeños de laboratorio y dejar intacta la conexión Sakila real.
Concepto
Una dependencia de FastAPI puede reemplazarse mediante app.dependency_overrides. Durante la prueba, get_db entrega una sesión de SQLite en memoria; al terminar, se limpia la sustitución. SQLite aquí es un fixture sintético para comprobar reglas y respuestas. No contiene los datos originales ni certifica compatibilidad completa con MySQL.
Los tests pueden crear y poblar esta base temporal porque no se conecta a Sakila. En cambio, la aplicación educativa conserva la regla de no ejecutar create_all() ni operaciones de escritura sobre las tablas canónicas.
Ejemplo
Un fixture de pytest puede preparar la sesión de prueba. Asegúrate de que Base importe todos los modelos antes de crear las tablas:
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from app.database import get_db
from app.main import app
from app.models import Base, Customer
@pytest.fixture
def client():
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
Base.metadata.create_all(engine) # Solo la base temporal de test.
TestingSession = sessionmaker(bind=engine, autoflush=False)
def override_get_db():
with TestingSession() as session:
yield session
app.dependency_overrides[get_db] = override_get_db
try:
with TestClient(app) as test_client:
with TestingSession() as session:
session.add(
Customer(
customer_id=1,
first_name="Ana",
last_name="Ejemplo",
active=True,
)
)
session.commit()
yield test_client
finally:
app.dependency_overrides.clear()
engine.dispose()Cada respuesta de prueba utiliza una fila sintética como Ana Ejemplo, nunca valores atribuidos al Sakila real. El bloque finally limpia la dependencia y libera el motor incluso si falla una aserción.
Práctica guiada
- Busca la asignación a
app.dependency_overrides. - Comprueba que el motor de test usa SQLite en memoria.
- Confirma que el fixture borra la sustitución después de cada uso.
Reto
Agrega al fixture un Customer ficticio con clave 1 y comprueba que la sesión temporal haga commit() sobre SQLite.
Intenta el reto antes de consultar las pistas.
Quiz
Comprobación
La base de test ya está aislada y se identifica como sintética. A continuación probarás errores HTTP y entradas fuera de los límites.