async
não permitirá que o próximo teste seja iniciado até que async
conclua todas as suas tarefas. O que async
faz é envolver o retorno de chamada em uma Zona, onde todas as tarefas assíncronas (por exemplo setTimeout
) são rastreadas. Assim que todas as tarefas assíncronas forem concluídas, o é async
concluído.
Se você já trabalhou com Jasmine fora do Angular, pode ter visto done
sendo passado para o callback
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Aqui, é Jasmine nativo, onde dizemos a Jasmine que esse teste deve atrasar a conclusão até que ligemos done()
. Se não ligássemos done()
e em vez disso fizéssemos:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
O teste seria concluído antes mesmo da expectativa, porque a promessa é resolvida depois que o teste termina de executar as tarefas síncronas.
Com o Angular (em um ambiente Jasmine), o Angular realmente fará chamadas done
nos bastidores quando usarmos async
. Ele manterá o controle de todas as tarefas assíncronas na Zona e, quando todas forem concluídas, done
será chamado nos bastidores.
Em seu caso particular com a TestBed
configuração, você a usaria geralmente quando quiser compileComponents
. Eu raramente me deparo com uma situação em que eu teria que chamar de outra forma
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
Ao testar um componente que usa templateUrl
(se você não estiver usando webpack), o Angular precisa fazer uma solicitação XHR para obter o modelo, de forma que a compilação do componente seja assíncrona. Portanto, devemos esperar até que seja resolvido antes de continuar o teste.
async
não é necessário. Quando você está usandotemplateUrl
, é. No entanto, incluirasync
não "quebrará" um componente de modelo embutido. Você acha que é seguro dizer que pode-se usar como padrãoasync
para todos os testes?