Tests unitarios para servicios y utilidades
Cómo probar piezas pequeñas de código sin depender de toda la aplicación: servicios HTTP, mapeos, errores y helpers.
Un test unitario toma una pieza pequeña del sistema y la prueba con entradas controladas. La meta no es probar todo, sino dejar cubierta una regla importante para que no se rompa en el siguiente cambio.
Qué conviene probar primero
Empieza por código que transforma datos o decide algo. Por ejemplo: convertir una respuesta de Strapi en un modelo de pantalla, calcular totales, construir filtros o traducir errores HTTP a mensajes entendibles.
Estos tests suelen ser rápidos y baratos. Además ayudan a documentar cómo debería comportarse una función sin tener que leer toda la app.
Ejemplo: probar un mapeo
it('convierte el producto del backend al modelo de pantalla', () => {
const dto = createProductDto({ name: 'Apilador eléctrico' });
const product = mapProduct(dto);
expect(product.name).toBe('Apilador eléctrico');
expect(product.isActive).toBe(true);
});Servicios HTTP
Cuando un servicio llama al backend, el test no debería depender de internet ni de producción. Angular permite usar `provideHttpClientTesting()` y `HttpTestingController` para capturar la solicitud, revisar método/URL/body y responder con datos falsos dentro del test.
it('pide productos al endpoint correcto', () => {
service.list().subscribe();
const request = http.expectOne('/api/products');
expect(request.request.method).toBe('GET');
request.flush({ data: [] });
});Qué no conviene meter en un unitario
Un unitario es útil cuando protege una decisión pequeña. Pierde valor cuando intenta reemplazar una revisión de navegador, una prueba de integración completa o una validación real de backend.
- No depender de datos reales de producción.
- No probar estilos, responsive ni comportamiento de hover/focus.
- No recrear un flujo completo de usuario dentro de un spec pequeño.
- No usar fixtures gigantes que nadie entiende.
- No cubrir implementaciones internas si lo importante es el resultado visible de la función.
Cómo usamos Codex para aterrizar un test pequeño
En el backoffice, una buena forma de aplicar este enfoque es partir por un archivo chico y con spec cercano. Por ejemplo, `src/app/features/products/products.form.ts` define campos, defaults y mensajes de validación; su spec permite comprobar que esas reglas sigan estables.
Revisa src/app/features/products/products.form.ts y src/app/features/products/products.form.spec.ts.
Explícame qué regla de negocio o validación cubre cada parte, en palabras simples.
Propón un spec unitario pequeño para una regla que valga la pena proteger.
Implementa solo ese spec siguiendo el patrón existente.
Muestra el diff y ejecuta la verificación mínima.
Antes de ejecutar comandos, revisa package.json con npm pkg get scripts.npm pkg get scripts
git diff -- src/app/features/products/products.form.ts src/app/features/products/products.form.spec.ts
npm run typecheck
npm run test:ciChecklist al terminar
- El test tiene un nombre que explica el comportamiento.
- El fixture usa tipos explícitos, no any.
- El caso feliz y el caso de error están cubiertos cuando el riesgo lo justifica.
- El test no depende de datos reales de producción.
Recursos relacionados
¿Te fue útil este contenido?
Tu feedback nos ayuda a mejorar la documentación de Neges.
¿No encuentras lo que buscas?
Conversa con nuestro equipo de soporte en español. Respondemos por WhatsApp, correo o ticket en menos de 24 horas hábiles.