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?