DÍA 12Pruebas y contrato HTTP · Python Backend y APIs para Datos

Sustituye get_db en las pruebas con una SQLite temporal y filas sintéticas identificadas.

Día 12 22 minIntermedio

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

  1. Busca la asignación a app.dependency_overrides.
  2. Comprueba que el motor de test usa SQLite en memoria.
  3. 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

1. ¿Qué reemplaza app.dependency_overrides[get_db] durante la prueba?
2. ¿Qué representa Ana Ejemplo en el fixture?
3. ¿Qué hace app.dependency_overrides.clear() al final?

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.

TU PROGRESO

Cargando estado…