¿Cómo mockearías servicios, observables y `HttpClient` sin que el test quede acoplado a la implementación?

¿Cómo mockearías servicios, observables y `HttpClient` sin que el test quede acoplado a la implementación? en Angular: criterios sobre pruebas y rxJS, errore...

3 min de lecturaIntermedio
Media PruebasRxJSHttpClient

Detrás de "¿Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación?" suele haber una tensión real en Angular entre pruebas y rxJS.

En un nivel intermedio interesa ver si colocas bien los límites de "Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación", justificas por qué eliges ese patrón y explicas cómo lo mantendrías legible para el equipo.

Qué evalúa el entrevistador

  • Si distingues qué parte de "Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación" pertenece a pruebas y cuál debería resolverse en rxJS.
  • Si conviertes la respuesta en criterios observables: límites claros, impacto en el mantenimiento y forma de detectar regresiones.
  • Si sabes ubicar efectos, limpiezas, cancelación y propagación de errores sin contaminar la parte declarativa del código.

Respuesta sólida

  • Distingue qué parte puede seguir siendo pura y qué parte necesita sincronizarse con el mundo exterior.
  • Describe cómo controlarías suscripciones, cancelación, reintentos o cierre de recursos para que el componente no acumule efectos zombis.
  • Si hay asincronía, aclara qué harías con estados intermedios, errores y cambios rápidos de entrada.

Compromisos y errores comunes

  • El error habitual es usar efectos para derivar datos que podrían calcularse de forma pura o para tapar un mal diseño de dependencias.
  • Sin cancelación ni limpieza es muy fácil dejar trabajo en vuelo, respuestas tardías o cierres obsoletos.

Ejemplo de código

Este fragmento sirve para bajar "Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación" a código ejecutable y mostrar qué decisiones conviene hacer explícitas cuando pruebas empieza a cruzarse con rxJS.

import { HttpInterceptorFn } from '@angular/common/http';
import { catchError, throwError } from 'rxjs';

export const authInterceptor: HttpInterceptorFn = (request, next) => {
  const authenticatedRequest = request.clone({
    setHeaders: { Authorization: 'Bearer token-demo' },
  });

  return next(authenticatedRequest).pipe(
    catchError((error) => {
      console.error('Error HTTP', error.status);
      return throwError(() => error);
    }),
  );
};

Fíjate en que el ejemplo deja claras las fronteras de "Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación", nombra los estados relevantes y evita trabajo implícito que luego cuesta depurar.

Ejemplo o caso real

La forma seria de aterrizar "Cómo mockearías servicios, observables y HttpClient sin que el test quede acoplado a la implementación" es escoger un caso con usuarios reales, un criterio de éxito visible y una superficie de rollback pequeña. Eso obliga a hablar de impacto, no de dogmas, y evita convertir pruebas en arquitectura ornamental.

Frase corta de entrevista

Si una decisión de Angular no mejora claridad, coste de cambio o fiabilidad, probablemente aún no merece existir.

¿Completaste esta sección?

Marcarla como leída actualiza tu progreso.