async
non consentirà l'avvio del test successivo fino al async
termine di tutte le sue attività. Quello che async
fa è avvolgere il callback in una zona, dove setTimeout
vengono tracciate tutte le attività asincrone (ad esempio ). Una volta completate tutte le attività asincrone, il file viene async
completato.
Se hai mai lavorato con Jasmine al di fuori di Angular, potresti aver visto done
essere passato al callback
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Qui, questo è il nativo Jasmine, dove diciamo a Jasmine che questo test dovrebbe ritardare il completamento fino a quando non chiameremo done()
. Se non abbiamo chiamato done()
e invece abbiamo fatto questo:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Il test verrebbe completato anche prima dell'aspettativa, perché la promessa si risolve dopo che il test è terminato eseguendo le attività sincrone.
Con Angular (in un ambiente Jasmine), Angular chiamerà effettivamente done
dietro le quinte quando usiamo async
. Manterrà traccia di tutte le attività asincrone nella zona e, quando saranno terminate, done
verrà richiamato dietro le quinte.
Nel tuo caso particolare con la TestBed
configurazione, lo useresti generalmente quando vuoi compileComponents
. Raramente mi imbatto in una situazione in cui dovrei chiamarla altrimenti
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
Quando si prova un componente che utilizza templateUrl
(se non si utilizza webpack), Angular deve effettuare una richiesta XHR per ottenere il modello, quindi la compilazione del componente sarebbe asincrona. Quindi dovremmo aspettare fino a quando non si risolve prima di continuare i test.
async
non è necessario. Quando lo usitemplateUrl
, lo è. Tuttavia, l'inclusioneasync
non "interromperà" un componente del modello inline. Pensi che sia sicuro dire che si può semplicemente usareasync
per impostazione predefinita per ogni test?