unit test angular unit-testing karma-jasmine angular2-testing angular-test

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.