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?compileComponents
. Não tem nada a ver com o usoasync
em cada teste se é isso que você está perguntando. Quanto à segurança (quando você deve ligarcompileComponents
), consulte Quando devo chamar compileComponentsngOnInit
o componente é chamado. Às vezes, isso é importante durante o testeQuando você faz uma chamada assíncrona em seu teste, a função de teste real é concluída antes que a chamada assíncrona seja concluída. Quando você precisa verificar algum estado quando a chamada foi concluída (o que geralmente é o caso), a estrutura de teste relatará o teste como concluído enquanto ainda há trabalho assíncrono em andamento.
Com o uso,
async(...)
você diz à estrutura de teste para esperar até que a promessa de retorno ou observável seja concluída antes de tratar o teste como concluído.O código passado para
then(...)
será executado depois que a própria função de teste for concluída. Comasync()
você torna a estrutura de teste ciente de que ela precisa aguardar a conclusão de promessas e observáveis antes de tratar o teste como concluído.Veja também
fonte