Saltar al contenido

Prueba de Angular 2 – Llamada de función asíncrona – cuándo usar

Traemos la mejor información que hemos encontrado por todo internet. Nosotros queremos que te sea útil y si puedes aportar alguna mejora hazlo libremente.

Solución:

async no permitirá que comience la próxima prueba hasta que el async termina todas sus tareas. Qué async hace es envolver la devolución de llamada en una Zona, donde todas las tareas asincrónicas (por ejemplo, setTimeout) son rastreados. Una vez que se completan todas las tareas asincrónicas, entonces el async completa

Si alguna vez ha trabajado con Jasmine fuera de Angular, es posible que haya visto done siendo pasado a la devolución de llamada

it('..', function(done) 
  someAsyncAction().then(() => 
    expect(something).toBe(something);
    done();
  );
);

Aquí, esta es Jasmine nativa, donde le decimos a Jasmine que esta prueba debe retrasar la finalización hasta que llamemos done(). Si no llamamos done() y en su lugar hizo esto:

it('..', function() 
  someAsyncAction().then(() => 
    expect(something).toBe(something);
  );
);

La prueba se completaría incluso antes de la expectativa, porque la promesa resuelve después la prueba finaliza ejecutando las tareas síncronas.

Con Angular (en un entorno Jasmine), Angular realmente llamará done detrás de escena cuando usamos async. Realizará un seguimiento de todas las tareas asincrónicas en la Zona y, cuando hayan terminado, done se llamará detrás de escena.

En su caso particular con el TestBed configuración, usaría esto generalmente cuando quiera compileComponents. Rara vez me encuentro con una situación en la que tendría que llamarlo de otra manera

beforeEach(async(() => 
   TestBed.configureTestingModule(
     declarations: [MyModule],
     schemas: [NO_ERRORS_SCHEMA],
   )
   .compileComponent().then(() => 
      fixture = TestBed.createComponent(TestComponent);
   );
));

Al probar un componente que utiliza templateUrl (si no está utilizando un paquete web), Angular debe realizar una solicitud XHR para obtener la plantilla, por lo que la compilación del componente sería asíncrona. Por lo tanto, debemos esperar hasta que se resuelva antes de continuar con las pruebas.

Cuando realiza una llamada asíncrona en su prueba, la función de prueba real se completa antes de que se complete la llamada asíncrona. Cuando necesite verificar algún estado cuando se completó la llamada (que suele ser el caso), el marco de prueba informará que la prueba se completó mientras todavía hay trabajo asincrónico en curso.

con el uso async(...) le dice al marco de prueba que espere hasta que se complete la promesa de devolución o el observable antes de tratar la prueba como completada.

it('should show quote after getQuote promise (async)', async(() => 
  fixture.detectChanges();

  fixture.whenStable().then(() =>  // wait for async getQuote
    fixture.detectChanges();        // update view with quote
    expect(el.textContent).toBe(testQuote);
  );
));

El código pasado a then(...) será ejecutado después la función de prueba en sí se completó. Con async() hace que el marco de prueba sea consciente de que debe esperar a que se completen las promesas y los observables antes de tratar la prueba como completada.

Ver también

  • https://angular.io/guide/testing#async

Sección de Reseñas y Valoraciones

Agradecemos que quieras añadir valor a nuestro contenido aportando tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *