02 · Hexagonal

Tema 3 (parte 2) — Arquitectura Hexagonal Avanzada y Testing

Objetivo: finalizar la estructura hexagonal de inventory-service, dominar ciclos de vida de dependencias y asegurar calidad con tests unitarios y de integración.


1. Preparación y verificación preliminar

1.1 Asegúrate de haber completado la Sesión 2:

  • El servicio compila (npm run build) y arranca (npm run dev) sin errores.

  • Prisma está configurado y la tabla Inventory existe en tu base de datos.

1.2 Abre el proyecto en tu IDE y confirma que la estructura de carpetas es similar a la siguiente:

project/services/inventory-service/  
├── src/  
│   ├── domain/  
│   │   ├── model/  
│   │   └── ports/  
│   ├── application/  
│   │   ├── use-cases/  
│   │   └── container.ts  
│   ├── infrastructure/  
│   │   ├── http/  
│   │   ├── postgres/  
│   │   └── in-memory/  
│   └── main.ts  
├── tests/  
│   ├── unit/  
│   └── integration/  
├── prisma/  
│   ├── schema.prisma  
│   └── migrations/  
├── package.json  
├── tsconfig.json  
└── Dockerfile

2. Scopes y ciclo de vida en el contenedor DI (Awilix)

En src/application/container.ts vamos a registrar tres tipos de dependencias:

  • singleton() para objetos globales:

    • PrismaClient

    • Configuración

  • scoped() para repositorios y casos de uso:

    • InventoryRepositoryPostgres

    • ReserveStockUseCase

  • transient() para objetos de prueba o stateful temporales:

    • InMemoryInventoryRepository

Ejemplo de registro:

Por qué importa: usar los scopes adecuados garantiza que tu aplicación no comparta estado indebidamente ni abra múltiples conexiones innecesarias.


3. Adapter de prueba: InMemoryInventoryRepository

Crea el archivo src/infrastructure/in-memory/InMemoryInventoryRepository.ts con esta implementación:

Registra este adapter en el container bajo la clave inMemoryRepo con .transient().


4. Tests unitarios de dominio y puerto

Crea tests/unit/ReserveStockUseCase.spec.ts:

Estos tests corren en milisegundos y no necesitan Docker ni base de datos.


5. Tests de integración con Postgres en memoria

Crea tests/integration/InventoryRepositoryPostgres.spec.ts:

Última actualización