16. Integración entre capas de una aplicación

16.1 Introducción

Muchas aplicaciones se organizan en capas. Cada capa cumple una responsabilidad: recibir solicitudes, aplicar reglas de negocio, acceder a datos, comunicarse con otros servicios o preparar respuestas.

Las pruebas de integración entre capas verifican que esas partes colaboren correctamente. No se enfocan en una función aislada ni necesariamente en el sistema completo, sino en el recorrido de una operación a través de varias capas.

En este tema veremos cómo probar la integración entre controladores, servicios, repositorios y otras capas habituales de una aplicación.

16.2 Qué es una arquitectura por capas

Una arquitectura por capas organiza el código separando responsabilidades. Aunque los nombres cambian según la tecnología, una estructura común incluye:

  • Presentación o controlador: recibe entradas y devuelve respuestas.
  • Servicio o lógica de negocio: aplica reglas y coordina operaciones.
  • Repositorio o acceso a datos: guarda y consulta información.
  • Infraestructura: integra bases de datos, archivos, colas o servicios externos.

Esta separación ayuda a mantener el código organizado, pero también crea puntos de integración que deben probarse.

16.3 Qué significa integrar capas

Integrar capas significa comprobar que una solicitud o acción pueda pasar correctamente de una capa a otra, respetando datos, contratos y responsabilidades.

Por ejemplo, al crear un cliente:

  • El controlador recibe nombre, correo y documento.
  • El servicio valida reglas de negocio.
  • El repositorio consulta si el documento ya existe.
  • La base de datos guarda el nuevo cliente.
  • El controlador devuelve una respuesta adecuada.
Una prueba entre capas verifica que el flujo interno de una operación sea coherente desde la entrada hasta el estado final esperado.

16.4 Controlador y servicio

La integración entre controlador y servicio verifica que la capa de entrada invoque correctamente la lógica de negocio.

Aspectos que conviene probar:

  • Que los datos recibidos se transformen correctamente antes de llegar al servicio.
  • Que se llame a la operación adecuada.
  • Que los errores del servicio se traduzcan en respuestas comprensibles.
  • Que la respuesta del servicio se convierta en el formato esperado.
  • Que no se salten validaciones importantes.

Este tipo de prueba ayuda a detectar errores de mapeo, validación y manejo de respuestas.

16.5 Servicio y repositorio

La integración entre servicio y repositorio verifica que la lógica de negocio use correctamente la capa de datos.

Puede comprobar:

  • Que el servicio consulte los datos necesarios.
  • Que guarde entidades con valores correctos.
  • Que actualice el estado adecuado.
  • Que no modifique registros que no corresponden.
  • Que maneje casos donde el repositorio no encuentra datos.

Esta integración es muy importante porque muchas reglas de negocio dependen del estado persistido.

16.6 Repositorio y base de datos

La integración entre repositorio y base de datos verifica que las consultas reales funcionen contra el esquema real de prueba.

Debe revisar:

  • Consultas de lectura.
  • Inserciones.
  • Actualizaciones.
  • Eliminaciones físicas o lógicas.
  • Relaciones entre tablas.
  • Restricciones del esquema.

Este nivel detecta problemas que no aparecen si el repositorio se simula completamente.

16.7 Integración de varias capas

A veces conviene probar varias capas juntas. Por ejemplo, controlador, servicio, repositorio y base de datos. Esto permite verificar un flujo interno más completo sin llegar necesariamente a una prueba end-to-end con interfaz gráfica.

Este tipo de prueba puede responder preguntas como:

  • ¿La solicitud llega correctamente al servicio?
  • ¿La regla de negocio usa datos reales?
  • ¿El resultado queda persistido?
  • ¿La respuesta final representa correctamente el estado creado?
  • ¿Los errores se comunican de manera adecuada?

El alcance debe definirse con claridad para que la prueba no se vuelva demasiado amplia.

16.8 Validaciones entre capas

Las validaciones pueden ocurrir en varias capas. Algunas validaciones son de formato de entrada, otras son reglas de negocio y otras son restricciones de datos.

Tipo de validación Capa habitual Ejemplo
Formato Controlador o capa de entrada. Correo con formato inválido.
Regla de negocio Servicio. No permitir compra sin stock.
Restricción de datos Base de datos. Documento único para clientes.

Una prueba de integración puede verificar que las validaciones se ejecuten en el lugar esperado y que sus errores se propaguen correctamente.

16.9 Transformación de datos entre capas

Al pasar de una capa a otra, los datos suelen transformarse. Por ejemplo, una solicitud HTTP puede convertirse en un objeto de entrada, luego en una entidad de dominio y finalmente en registros de base de datos.

Errores frecuentes:

  • Campos olvidados durante el mapeo.
  • Fechas transformadas con formato incorrecto.
  • Importes redondeados de forma inesperada.
  • Estados representados con nombres distintos.
  • Valores opcionales convertidos incorrectamente en nulos.

Las pruebas entre capas son muy útiles para detectar estos errores de transformación.

16.10 Manejo de errores entre capas

Cuando una capa falla, las demás deben manejar esa situación de forma controlada. Por ejemplo, si el servicio detecta una regla inválida, el controlador debe devolver una respuesta adecuada. Si la base de datos rechaza una operación, el servicio debe evitar dejar un estado inconsistente.

Conviene probar errores como:

  • Datos de entrada inválidos.
  • Entidad no encontrada.
  • Duplicado detectado.
  • Falla de persistencia.
  • Operación no permitida por estado actual.

La prueba debe verificar tanto el error devuelto como el estado final del sistema.

16.11 Cuándo simular una capa

No siempre es necesario integrar todas las capas reales. A veces conviene simular una capa para concentrarse en la colaboración que interesa.

Ejemplos:

  • Probar controlador y servicio simulando el repositorio.
  • Probar servicio y repositorio sin levantar la interfaz.
  • Probar el cliente de un servicio externo con un servidor simulado.
  • Probar repositorio contra base de datos sin pasar por controlador.

La decisión depende del objetivo de la prueba. Simular una capa es válido si esa capa no forma parte del riesgo que queremos verificar.

16.12 Cuándo integrar todas las capas internas

Integrar todas las capas internas puede ser útil para flujos críticos. Por ejemplo, cuando queremos verificar que una solicitud completa llega hasta la base de datos y vuelve con una respuesta correcta.

Conviene hacerlo cuando:

  • El flujo es importante para el negocio.
  • Hay transformaciones de datos entre capas.
  • El estado persistido es relevante.
  • Se quiere validar el manejo completo de errores internos.
  • El costo de ejecutar la prueba sigue siendo razonable.

Este tipo de prueba no debería reemplazar a pruebas más específicas, pero puede dar mucha confianza sobre colaboraciones internas importantes.

16.13 Ejemplo: crear cliente

Supongamos una prueba para crear un cliente usando controlador, servicio, repositorio y base de datos.

Paso Qué se verifica
Enviar solicitud con datos válidos. El controlador recibe y transforma la entrada.
Ejecutar regla de documento único. El servicio consulta el repositorio.
Guardar cliente. El repositorio persiste datos en la base.
Consultar cliente creado. El estado final coincide con lo esperado.
Devolver respuesta. El controlador informa creación exitosa.

16.14 Ejemplo negativo: cliente duplicado

Para el mismo caso, una prueba negativa podría preparar un cliente existente y luego intentar crear otro con el mismo documento.

La prueba debería verificar:

  • El servicio detecta el duplicado.
  • No se crea un segundo cliente.
  • La base de datos conserva un único registro.
  • El controlador devuelve un error claro.
  • La respuesta no expone detalles técnicos innecesarios.

Este ejemplo muestra por qué una prueba entre capas debe revisar respuesta y estado final.

16.15 Errores comunes

Al probar integración entre capas, suelen aparecer errores como:

  • Probar demasiadas reglas en una sola prueba.
  • No verificar el estado persistido.
  • Simular tantas capas que la prueba deja de ser integración.
  • Incluir tantas capas que la prueba se vuelve difícil de diagnosticar.
  • Ignorar errores de transformación de datos.
  • No probar cómo se propagan errores entre capas.
  • Confundir pruebas entre capas con pruebas end-to-end de interfaz gráfica.

16.16 Lista de verificación

Antes de considerar completa una prueba entre capas, conviene revisar:

  • ¿Está claro qué capas participan?
  • ¿La prueba verifica una colaboración concreta?
  • ¿Los datos se transforman correctamente entre capas?
  • ¿Se verifica la respuesta final?
  • ¿Se verifica el estado persistido si corresponde?
  • ¿Los errores se propagan y traducen correctamente?
  • ¿El alcance sigue siendo razonable y diagnosticable?

16.17 Qué debes recordar de este tema

  • Las aplicaciones por capas separan responsabilidades, pero esas capas deben integrarse correctamente.
  • Una prueba entre capas verifica el recorrido interno de una operación.
  • Controladores, servicios, repositorios y bases de datos pueden probarse en distintos alcances.
  • Las transformaciones de datos y el manejo de errores son puntos críticos.
  • No siempre hay que integrar todas las capas; depende del objetivo de la prueba.
  • Para flujos importantes, conviene verificar respuesta y estado final.

16.18 Conclusión

La integración entre capas permite comprobar que la estructura interna de una aplicación funciona como una colaboración coherente. Cada capa debe cumplir su responsabilidad y comunicarse correctamente con las demás.

Estas pruebas son especialmente útiles para detectar errores de mapeo, validación, persistencia y propagación de errores antes de llegar a pruebas más amplias.

En el próximo tema veremos la integración entre servicios internos, un escenario común en sistemas modulares y distribuidos.