В чем разница между fakeAsync и async в тестировании angular2
Я знаю, что функция tick () использует fakeAsync. И также я могу использовать приспособление.whenStable ().затем () с async и fakeAsync. Я хочу знать точный вариант использования для них обоих. Может ли кто-нибудь объяснить это примерами.
примечание: Я хочу использовать поддельный сервис или заглушку в обоих сценариях.
1 ответов
по большей части их можно использовать взаимозаменяемо. Я не могу придумать ничего с моей головы, в которой есть требуются над другим, за исключением случая компонентов, внешние шаблоны и стили которых не компилируются встроенным в компонент для тестирования (т. е. с помощью SystemJS). При использовании SystemJS вызовы XHR выполняются для внешних шаблонов и стилей. fakeAsync
не может использоваться при вызовах XHR. С другой стороны, при использовании Webpack внешние шаблоны и стили компилируются inline, поэтому вы можете использовать fakeAsync
.
кроме этого, я думаю, что это вопрос предпочтения стиля. Одно я могу сказать: представьте, что вам нужно сделать несколько асинхронных вызовов, как в . Вам нужно вложенное fixture.whenStable()
звонки, которые вызывают начинают выглядеть довольно уродливо
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(something)
changeSomething()
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(something)
changeSomething();
fixture.detectChanges()
fixture.whenStable().then(() => {
expect(somthingeElse)
})
})
})
это может выглядеть чище (и проще) без всех этих fixture.whenStables()
fixture.detectChanges();
tick();
expect(something)
changeSomething()
fixture.detectChanges();
tick();
expect(somethingElse)
changeSomething()
fixture.detectChanges();
tick();
expect(somethingElse);
другой что я могу добавить это ОКР часть меня всегда нужно проверить, что мои звонки в fixture.whenStable()
называется
fixture.whenStable().then(() => {
expect(...)
console.log('called...')
})
представьте, что вы забыли завернуть тест в async
. Без этого тест будет завершен до fixture.whenStable
разрешение, и вы никогда этого не узнаете. Это будет выглядеть как пройденный тест, который является ложноположительным. Что на самом деле произошло, так это то, что утверждение никогда даже не называлось.
по этой причине, я на самом деле отдаляюсь от async
. Но если вам нравится этот стиль, и доверяйте себе, что вы всегда обертываете тест в async
, тогда придерживайтесь его. Но с fakeAsync
, все вызывается синхронно, поэтому нет никаких шансов, что утверждение не будет вызвано.