web-dev-qa-db-ja.com

Angular2テストでのfakeAsyncとasyncの違いは何ですか

tick()関数はfakeAsyncを利用することを知っています。また、asyncおよびfakeAsyncとともにfixture.whenStable().then()を使用することもできます。

両方の正確なユースケースを知りたい。誰でもこれを例で説明できますか。

注:両方のシナリオで偽のサービスまたはスタブを使用したい

19
Amit Chigadani

ほとんどの場合、それらは同じ意味で使用できます。外部テンプレートとそのコンポーネントの場合を除いて、一方が他方に対してrequiredであるという私の頭の上のものは考えられませんスタイルは、テストのためにコンポーネントにインラインでコンパイルされません(つまり、SystemJSを使用)。 SystemJSを使用する場合、外部テンプレートとスタイルに対してXHR呼び出しが行われます。 XHR呼び出しが行われている場合、fakeAsyncは使用できません。一方、Webpackを使用する場合、外部テンプレートとスタイルはインラインでコンパイルされるため、fakeAsyncを使用できます。

それ以外は、スタイルの好みの問題だと思います。 この例 のように、非同期の複数の呼び出しを行う必要があると想像できます。ネストされたfixture.whenStable()呼び出しが必要です。これはstartを呼び出してかなりいように見えます

_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);
_

私が追加するかもしれないもう一つは、 [〜#〜] ocd [〜#〜] 私の一部always確認する必要があるfixture.whenStable()での呼び出しが呼び出されること

_fixture.whenStable().then(() => {
  expect(...)
  console.log('called...')
})
_

asyncでテストをラップするのを忘れたことを想像してください。それがなければ、テストは_fixture.whenStable_解決の前に完了し、あなたはそれを知ることは決してないでしょう。テストに合格したように見えますが、これは誤検知です。実際に起こったことは、アサーションが呼び出されることさえなかったことです。

このため、実際にasyncから離れています。しかし、そのスタイルが好きで、常にasyncでテストをラップすることを信じて、それを固守してください。ただし、fakeAsyncを使用すると、すべてが同期的に呼び出されるため、アサーションが呼び出されない可能性があります。

21
Paul Samsotha