В чем разница между 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, все вызывается синхронно, поэтому нет никаких шансов, что утверждение не будет вызвано.