unit - Angular 2 Testing-Llamada de función asíncrona-cuándo usar
unit testing angular (2)
Cuando realiza una llamada asincrónica en su prueba, la función de prueba real se completa antes de que se complete la llamada asincrónica. 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 asíncrono en curso.
Con el uso
async(...)
le dice al marco de prueba que espere hasta que se complete la promesa de devolución u 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(...)
se ejecutará
después de que
se complete la función de prueba.
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
¿Cuándo utiliza la función asíncrona en TestBed cuando prueba en Angular 2?
¿Cuándo usas esto?
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
});
¿Y cuándo usas esto?
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
}));
¿Alguien puede iluminarme sobre esto?
async
no permitirá que comience la próxima prueba hasta que
async
finalice todas sus tareas.
Lo que hace
async
es envolver la devolución de llamada en una Zona, donde se realiza un seguimiento de todas las tareas asincrónicas (por ejemplo,
setTimeout
).
Una vez que se completan todas las tareas asincrónicas, se completa la
async
.
Si alguna vez trabajó con Jasmine fuera de Angular, es posible que haya visto que se le pasa a la devolución de llamada
it(''..'', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Aquí, este es Jasmine nativo, donde le decimos a Jasmine que esta prueba debería retrasar la finalización hasta que llamemos a
done()
.
Si no llamamos a
done()
y en su lugar hicimos esto:
it(''..'', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
La prueba se completaría incluso antes de lo esperado, porque la promesa se resuelve una vez que la prueba termina de ejecutar las tareas sincrónicas.
Con Angular (en un entorno de jazmín), Angular en realidad llamará a
done
entre bastidores cuando usemos
async
.
Realizará un seguimiento de todas las tareas asincrónicas en la Zona, y cuando estén todas terminadas, se llamará detrás de escena.
En su caso particular con la configuración de
TestBed
, lo usaría 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 usa
templateUrl
(si no está usando el paquete web), Angular necesita hacer 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.