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.