async
no permitirá que comience la siguiente prueba hasta que async
finalice todas sus tareas. Lo que async
hace es envolver la devolución de llamada en una Zona, donde setTimeout
se rastrean todas las tareas asincrónicas (p . Una vez que se completan todas las tareas asincrónicas, se async
completa.
Si alguna vez ha trabajado con Jasmine fuera de Angular, es posible que haya visto que done
se 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 done()
. Si no llamamos done()
y en su lugar hicimos esto:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
La prueba se completará incluso antes de la expectativa, porque la promesa se resuelve una vez que la prueba termina de ejecutar las tareas sincrónicas.
Con Angular (en un entorno Jasmine), Angular realmente llamará done
detrás de escena cuando usemos async
. Realizará un seguimiento de todas las tareas asincrónicas en la Zona y, cuando estén todas terminadas, done
se llamará entre bastidores.
En su caso particular con la TestBed
configuración, lo usaría generalmente cuando lo desee 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 un paquete web), entonces Angular necesita realizar una solicitud XHR para obtener la plantilla, por lo que la compilación del componente sería asincrónica. Por lo tanto, debemos esperar hasta que se resuelva antes de continuar con la prueba.
async
no es necesario. Cuando lo está usandotemplateUrl
, lo es. Sin embargo, la inclusiónasync
no "romperá" un componente de plantilla en línea. ¿Crees que es seguro decir que se puede usarasync
de forma predeterminada para cada prueba?compileComponents
. No tiene nada que ver con el usoasync
en cada prueba si eso es lo que está preguntando. En cuanto a estar seguro (cuándo debe llamarcompileComponents
), consulte ¿ Cuándo se supone que debo llamar a compileComponentsngOnInit
se llama al componente. A veces, esto es importante al realizar las pruebasCuando 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 en el que 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 indica 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.El código pasado a
then(...)
se ejecutará después de que se complete la función de prueba. Conasync()
usted, 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
fuente