asyncне позволит начать следующий тест, пока он не завершит asyncвсе свои задачи. Что asyncделает, так это переносит обратный вызов в Зону, где setTimeoutотслеживаются все асинхронные задачи (например ). Как только все асинхронные задачи завершены, asyncзавершается.
Если вы когда-либо работали с Jasmine вне Angular, возможно, вы видели, doneкак передается обратный вызов
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Здесь это родной Jasmine, где мы говорим Jasmine, что этот тест должен отложить выполнение до тех пор, пока мы не вызовем done(). Если бы мы не позвонили, done()а сделали это:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Тест завершится даже раньше, чем ожидалось, потому что обещание разрешается после того, как тест завершит выполнение синхронных задач.
С Angular (в среде Jasmine) Angular фактически будет вызывать doneза кулисами, когда мы используем async. Он будет отслеживать все асинхронные задачи в Зоне, и когда они все doneбудут завершены, будет вызываться за кулисами.
В вашем конкретном случае с TestBedконфигурацией вы обычно используете это, когда хотите compileComponents. Я редко сталкиваюсь с ситуацией, в которой мне пришлось бы назвать это иначе
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
При тестировании компонента, который использует templateUrl(если вы не используете webpack), Angular необходимо сделать запрос XHR для получения шаблона, поэтому компиляция компонента будет асинхронной. Поэтому мы должны дождаться разрешения, прежде чем продолжить тестирование.
asyncэтом нет необходимости. Когда вы используетеtemplateUrl, это так. Однако включениеasyncне "сломает" компонент встроенного шаблона. Как вы думаете, можно ли с уверенностью сказать, что можно просто использоватьasyncпо умолчанию для каждого теста?