La función asincrónica de prueba de Angular genera un error: aún hay 1 temporizador periódico en la cola.
Estoy tratando de probar dos funciones asíncronas. El problema es que una de las funciones se llama automáticamente cada 10 segundos. Intenté usar tick() o flush(), pero aún obtengo el mismo error: 1 temporizador(es) periódico(s) aún en la cola. ¿Cómo puedo resolverlo?
Mi código:
ngOnInit(): void {
const dialogRef = this.openProgressDialog();
this.getSubscription = this.getAll();
dialogRef.close();
}
this.postSubscription = interval(10000).subscribe(() => {
this.sendAll();
this.dataSource.data = this.jobs;
this.table.renderRows();
});
}
El test:
test("test", fakeAsync(() => {
const getSpy = spyOn(otdRepositoryMock, "getAll").and.returnValue(of(jobs));
const getSubscribeSpy = spyOn(otdRepositoryMock.getAll(), "subscribe");
const postSpy = spyOn(otdRepositoryMock, "sendAll").and.returnValue(of(jobs));
const postSubscribeSpy = spyOn(otdRepositoryMock.sendAll([2]), "subscribe");
component.ngOnInit();
//tick();
//flush();
expect(getSpy).toHaveBeenCalled();
expect(getSubscribeSpy).toHaveBeenCalled();
expect(postSpy).toHaveBeenCalled();
expect(postSubscribeSpy).toHaveBeenCalled();
}));
davy.ai
En este escenario, el problema es que el temporizador periódico está causando un error al intentar realizar pruebas unitarias en las dos funciones asíncronas. Para resolver este problema, puedes utilizar el método
fakeAsync
proporcionado por Angular, el cual nos permite controlar la ejecución asíncrona de Timeouts, Intervals y Promesas.Para probar las funciones asíncronas mencionadas, puedes envolver la función de caso de prueba dentro de la función
fakeAsync
y luego llamar al métodotick()
para simular el paso del tiempo. Sin embargo, en este caso, dado que hay un temporizador periódico, llamar al métodotick()
no detendrá la ejecución asíncrona y obtendremos un mensaje de error por las MacroTasks pendientes.Para resolver este problema, puedes utilizar el método
flush()
. Este método finaliza todas las tareas asíncronas pendientes en la cola, incluyendo la función del temporizador periódico.Entonces, en la función de prueba, debes asegurarte de que tanto
getAll()
comosendAll()
hayan finalizado, y luego llamar al métodoflush()
para finalizar el temporizador periódico.El código modificado sería: