Pruebas Unitarias en Jasmine: Espías y Stubs en Angular
Clase 32 de 38 • Curso de Unit Testing para MEAN con Jasmine
Resumen
¿Cómo crear espías con Jasmine sobre objetos de configuración en JavaScript?
Cuando trabajamos con Jasmine, una popular biblioteca de pruebas en JavaScript, es posible crear espías no solo sobre nuestras propias clases o las que utilizamos a través de bibliotecas, sino también sobre los objetos de configuración que JavaScript nos ofrece. Un ejemplo clave es el objeto global window
, el cual permite, entre otras cosas, abrir una nueva URL en una pestaña diferente. Exploraremos cómo implementar esto mediante espías en Jasmine para mejorar nuestras pruebas unitarias.
¿Qué implicaciones tiene espiar métodos del objeto window
?
Espiar métodos del objeto window
es una práctica que nos permite verificar que dichos métodos sean llamados con los parámetros correctos. Imagina que tienes un componente que abre URLs al llamarse. Podrías querer asegurarte de que el método open
de window
se invoca apropiadamente. Esto asegura que los comportamientos esperados ocurren cuando interactúas con tu aplicación.
describe('Espionando métodos del objeto window', () => {
it('debería llamar al método open de window con la URL correcta', () => {
spyOn(window, 'open');
const url = 'https://example.com';
// La lógica que llama a window.open va aquí
expect(window.open).toHaveBeenCalledWith(url);
});
});
¿Cómo se gestionan los servicios simulados o "Stubs"?
Crear stubs, o servicios simulados, es crucial para evitar dependencias externas al probar nuestras clases. En Angular, por ejemplo, podrías tener componentes que dependen de diversos servicios, como un snackbar
, el pinservice
, o la librería de formularios reactivos. Para probarlos, necesitamos "apartar" estas dependencias, lo que se hace comúnmente con stubs.
- Repositorio Stub: Se crea un método que retorne observables, como
getPins
. - Snackbar Stub: Solo necesitamos definir el método
open
. - PinService Stub: Creamos un
Observer
y lo conectamos al componente que estamos probando. - ReactiveFormsModule Import: En lugar de crear un espía, importamos el módulo.
¿Cómo resolver objetos JS evitando mutaciones no deseadas?
Un desafío frecuente en JavaScript es asegurar que un objeto no modifique el original al pasarse por referencia. Usamos un truco para tener una nueva copia:
const nuevaCopia = JSON.parse(JSON.stringify(objetoOriginal));
Esto garantiza que cualquier nivel de anidación en tus objetos JS no afecta al original.
¿Qué pasos seguir para configurar las pruebas unitarias de un componente?
Una vez que nuestros stubs están creados, es importante asegurar que nuestras pruebas unitarias están configuradas correctamente:
- Importación correcta de dependencias: Asegúrate de importar módulos y servicios desde las bibliotecas correctas.
- Evitar errores de esquema: Configura correctamente el esquema de errores en tus archivos de prueba para evitar alertas innecesarias.
- Verificar cobertura de pruebas: Revisa el informe de cobertura para asegurar que las pruebas han cubierto el componente adecuadamente.
Este enfoque estructurado no solo mejora la robustez de tus pruebas, sino que aumenta la confiabilidad de tu aplicación en entorno de producción. Las pruebas unitarias, cuando están bien estructuradas, no solo detectan errores más rápidamente, sino que facilitan el mantenimiento del código a largo plazo. ¡Sigue explorando y afina tus habilidades en pruebas unitarias!