Ответ 1
async
позволит следующий тест не запускаться до тех пор, пока async
не закончит все задачи. То, что async
делает, - это завершение обратного вызова в Зоне, где отслеживаются все асинхронные задачи (например, setTimeout
). После завершения всех асинхронных задач завершается async
.
Если вы когда-либо работали с Jasmine вне Angular, вы могли видеть, что done
передается обратному сообщению
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
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 для получения шаблона, поэтому компиляция компонента будет асинхронной. Поэтому мы должны подождать, пока он решит продолжить тестирование.