- 1

Pruebas unitarias en Angular con Yes y herramientas IA
01:50 - 2

Unit Testing en Angular para eCommerce con Renderizado del Servidor
04:22 - 3

Configuración de Jest para pruebas unitarias en Angular
14:26 - 4

Cobertura de Código: Configuración y Análisis en Angular
05:46 quiz de Introducción y Configuración de Pruebas
Pruebas de Espionaje en Componentes sin Dependencias
Clase 17 de 23 • Curso de Pruebas Unitarias en Angular
Contenido del curso
- 5

Uso de Expectator para Testing en Angular
03:36 - 6

Pruebas de Pipes en Angular con Spectator y Jest
10:08 - 7

Generación de Pruebas Unitarias con Inteligencia Artificial
13:41 - 8

Testing de Servicios en Angular con Jest y Spectator
15:11 - 9

Creación de Datos Simulados con la Librería Faker.js
10:39 - 10

Pruebas Unitarias para Servicios con Inyección de Dependencias en Angular
15:58 - 11

Pruebas Unitarias con Mocking en MetaTax Service
08:28 - 12

Pruebas de Servicios HTTP Client en Angular con Spectarer y Jest
15:08 quiz de Pruebas de Servicios y Dependencias
- 13

Pruebas Unitarias con fetch en JavaScript y Mocking de Servicios
09:56 - 14

Mocking de APIs Globales en JavaScript para Pruebas Unitarias
09:33 - 15

Pruebas Unitarias de Componentes en Angular con Spectator
11:51 - 16

Pruebas de Componentes con Data Test ID y Selectores CSS
07:26 - 17

Pruebas de Espionaje en Componentes sin Dependencias
10:29 - 18

Unit Testing para Componentes con Inyección de Dependencias
15:13 quiz de Pruebas de Componentes
- 19

Mocking y pruebas unitarias en Angular: Inyección de dependencias
10:20 - 20

Pruebas Complejas en Angular: Testing de Componentes y Servicios
15:22 - 21

Pruebas de Mocking y Deferred Components en Angular
10:26 - 22

Pruebas de Interacción en Componentes Angular: Galería de Imágenes
08:46 - 23

Pruebas Unitarias en Angular con Spector y AI
08:04
El espionaje en el mundo de las pruebas unitarias es una técnica fundamental para verificar el comportamiento de nuestros componentes. Mediante esta estrategia, podemos rastrear cuándo se llama un evento, cuántas veces y con qué parámetros, lo que nos permite validar que nuestras aplicaciones funcionan exactamente como esperamos. Dominar estas técnicas nos ayudará a crear pruebas más robustas y a detectar errores antes de que lleguen a producción.
¿Qué es el espionaje (spying) en pruebas unitarias?
El espionaje o "spying" en el contexto de pruebas unitarias es una técnica que nos permite monitorear el comportamiento de funciones, métodos o eventos. Básicamente, podemos "espiar" cuándo una función ha sido llamada, cuántas veces y con qué parámetros.
En clases anteriores, ya habíamos implementado esta técnica con el servicio MetaTagService, donde creamos una suplantación del servicio real y, mediante el uso de jest.fn(), pudimos rastrear sus llamadas. Ahora, aplicaremos esta misma estrategia para espiar elementos específicos de nuestros componentes.
El patrón de las tres A en testing
Cuando escribimos pruebas unitarias, es recomendable seguir el patrón de las tres A:
- Arrange (Preparar): Preparamos todo el entorno necesario para la prueba, incluyendo la creación de espías.
- Act (Actuar): Ejecutamos la acción que queremos probar.
- Assert (Verificar): Comprobamos si los resultados obtenidos coinciden con nuestras expectativas.
Este patrón nos ayuda a estructurar nuestras pruebas de manera clara y ordenada, facilitando su mantenimiento y comprensión.
¿Cómo implementar espías en componentes Angular?
Para ilustrar cómo implementar espías en componentes, vamos a crear una prueba para la función addToCart de nuestro componente. Esta función debe emitir un valor con los datos del producto actual cuando se ejecuta.
Creando un espía para el método emit
A diferencia de los servicios que se inyectan como dependencias, los @Output no se inyectan de la misma manera. Por lo tanto, necesitamos una estrategia diferente para espiarlos:
// Creamos un espía para el método emit del output addToCart
const emitSpy = jest.spyOn(component.addToCart, 'emit');
// Renderizamos el componente
spectator.detectChanges();
// Simulamos un clic en el botón
spectator.click('add-to-cart-button');
// Verificamos que emit fue llamado con el producto
expect(emitSpy).toHaveBeenCalledWith(product);
Es importante notar que estamos siguiendo la convención de nombrar nuestro espía con el nombre de la función que queremos espiar seguido de "Spy" (emitSpy). Esto hace que nuestro código sea más legible y mantenible.
Probando la interacción del usuario
Una mejor práctica es probar cómo interactúa el usuario con nuestro componente, en lugar de llamar directamente a los métodos:
it('debería emitir un producto cuando el botón es clickeado', () => {
// Arrange (Preparar)
const emitSpy = jest.spyOn(component.addToCart, 'emit');
spectator.detectChanges();
// Act (Actuar)
spectator.click('add-to-cart-button');
// Assert (Verificar)
expect(emitSpy).toHaveBeenCalledWith(product);
});
Esta aproximación es más robusta porque:
- Prueba la interacción real del usuario: Verifica que el botón existe y que al hacer clic en él se desencadena la acción esperada.
- Detecta cambios en la estructura: Si alguien elimina el evento de clic del botón, la prueba fallará.
- Simula el uso real: Refleja cómo los usuarios interactúan con la aplicación.
¿Por qué es importante probar desde la perspectiva del usuario?
Cuando escribimos pruebas para componentes, es fundamental pensar en cómo los usuarios interactúan con ellos. En lugar de probar directamente los métodos internos, debemos simular las acciones que realizaría un usuario:
- Si el usuario hace clic en un botón, nuestra prueba debe hacer clic en ese botón.
- Si el usuario selecciona una opción de un dropdown, nuestra prueba debe seleccionar esa opción.
- Si el usuario completa un formulario, nuestra prueba debe completar ese formulario.
Esta aproximación nos permite detectar problemas que afectarían a los usuarios reales, como:
- Botones que no responden a clics
- Elementos de interfaz que no están correctamente conectados a sus funciones
- Flujos de usuario interrumpidos por errores en la lógica
Ejemplo práctico
En nuestro ejemplo, en lugar de llamar directamente a component.addToCart.emit(), simulamos un clic en el botón que tiene el atributo data-testid="add-to-cart-button":
// Mejor aproximación
spectator.click('add-to-cart-button');
// En lugar de
component.addToCart.emit(product);
Si alguien elimina el evento de clic del botón, nuestra prueba fallará, alertándonos del problema antes de que llegue a producción.
El testing desde la perspectiva del usuario nos ayuda a crear aplicaciones más robustas y a detectar problemas que podrían pasar desapercibidos con pruebas más tradicionales centradas en la implementación.
En la próxima clase, abordaremos cómo escribir pruebas para componentes que tienen inyecciones de dependencias, lo que nos permitirá completar nuestro conocimiento sobre pruebas unitarias en Angular.