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
по умолчанию для каждого теста?