Blog Tests y calidad técnica con Codex

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.

12 min de lectura

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

product.mapper.spec.tsts
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.

products.service.spec.tsts
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.

prompt-codex.txttext
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.
terminalbash
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:ci

Checklist 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.

Soporte humano

¿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.

soporte@neges.clLun a Vie · 9 a 18 hrs
+56 9 0000 0000WhatsApp Business