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
по умолчанию для каждого теста?compileComponents
. Это не имеет ничего общего с использованиемasync
в каждом тесте, если вы об этом спрашиваете. Что касается безопасности (когда вам следует позвонитьcompileComponents
), см. Когда я должен вызывать compileComponentsngOnInit
вызывается компонент. Иногда это имеет значение при тестированииКогда вы выполняете асинхронный вызов в своем тесте, фактическая функция тестирования завершается до завершения асинхронного вызова. Когда вам нужно проверить какое-либо состояние, когда вызов был завершен (что обычно бывает), тогда тестовая среда сообщит, что тест завершен, пока еще продолжается асинхронная работа.
Используя using,
async(...)
вы указываете среде тестирования дождаться завершения обещания возврата или наблюдаемого, прежде чем рассматривать тест как завершенный.Код, переданный в,
then(...)
будет выполнен после завершения самой тестовой функции. С помощьюasync()
вы сообщаете платформе тестирования, что ей нужно дождаться завершения обещаний и наблюдаемых, прежде чем рассматривать тест как завершенный.Смотрите также
источник