es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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();
  }));
Tags:  , , , ,

Answer

  1. Avatar for 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étodo tick() para simular el paso del tiempo. Sin embargo, en este caso, dado que hay un temporizador periódico, llamar al método tick() 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() como sendAll() hayan finalizado, y luego llamar al método flush() para finalizar el temporizador periódico.

    El código modificado sería:

    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(); //esperar hasta que getAll() y sendAll() hayan finalizado
    
        flush(); //finalizar el temporizador periódico
    
        expect(getSpy).toHaveBeenCalled();
        expect(getSubscribeSpy).toHaveBeenCalled();
        expect(postSpy).toHaveBeenCalled();
        expect(postSubscribeSpy).toHaveBeenCalled();
      }));
    

Comments are closed.