web-dev-qa-db-fra.com

Quelle est la différence entre fakeAsync et async dans les tests angular2

Je sais que la fonction tick() utilise fakeAsync. Et je peux aussi utiliser fixture.whenStable().then() avec async et fakeAsync également.

Je veux connaître le cas d'utilisation exact pour les deux. Quelqu'un peut-il expliquer cela avec des exemples.

Remarque: je veux utiliser Fake Service ou Stub dans les deux scénarios.

19
Amit Chigadani

Pour la plupart, ils peuvent être utilisés de manière interchangeable. Je ne peux penser à rien du haut de ma tête dans lequel l'un est requis par rapport à l'autre, à l'exception du cas des composants dont les modèles externes et les styles ne sont pas compilés en ligne dans le composant pour les tests (c'est-à-dire en utilisant SystemJS). Lorsque vous utilisez SystemJS, les appels XHR sont effectués pour les modèles et styles externes. fakeAsync ne peut pas être utilisé lors d'appels XHR. En revanche, lorsque vous utilisez Webpack, les modèles et styles externes sont compilés en ligne, vous pouvez donc utiliser fakeAsync.

A part ça, je pense que c'est une question de préférence de style. Une chose que je peux dire est d'imaginer que vous devez effectuer plusieurs appels asynchrones, comme dans cet exemple . Vous avez besoin d'appels imbriqués fixture.whenStable(), qui appellent commencer à regarder assez laid

fixture.detectChanges();
fixture.whenStable().then(() => {
  expect(something)

  changeSomething()
  fixture.detectChanges();
  fixture.whenStable().then(() => {
    expect(something)
    changeSomething();
    fixture.detectChanges()

    fixture.whenStable().then(() => {
      expect(somthingeElse)
    })
  })
})

Cela pourrait sembler plus propre (et plus facile à raisonner) sans tous ces fixture.whenStables()

fixture.detectChanges();
tick();
expect(something)

changeSomething()
fixture.detectChanges();
tick();
expect(somethingElse)

changeSomething()
fixture.detectChanges();
tick();
expect(somethingElse);

Une autre chose que je pourrais ajouter est la OCD partie de moi toujours doit vérifier que mes appels dans la fixture.whenStable() sont appelés

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

Imaginez que vous avez oublié d'envelopper le test dans async. Sans cela, le test se terminera avant la résolution fixture.whenStable, Et vous ne le saurez jamais. Il ressemblera au test réussi, ce qui est un faux positif. Ce qui s'est réellement passé, c'est que l'assertion n'a jamais été appelée.

Pour cette raison, je me suis éloigné de async. Mais si vous aimez ce style, et croyez-vous que vous enveloppez toujours le test dans async, alors respectez-le. Mais avec fakeAsync, tout est appelé de façon synchrone, il n'y a donc aucune chance que l'assertion ne soit pas appelée.

21
Paul Samsotha