I know that tick()
function utilizes fakeAsync
. And also I can use fixture.whenStable().then()
with async
and fakeAsync
as well.
I want to know the exact use case for both of them. Can anyone explain this with examples.
Note : I want to use Fake Service or Stub in both the scenarios.
For the most part they can be used interchangeably. I can't think of anything off the top of my head in which one is required over the other, except for the case of components whose external templates and styles are not compiled inline in to the component for testing (i.e. using SystemJS). When using SystemJS, XHR calls are made for the external templates and styles.
fakeAsync
cannot be used when there are XHR calls made. On the other hand, when using Webpack, the external templates and styles get compiled inline, so you can usefakeAsync
.Other than that, I think it's a matter of style preference. One thing I can say is imagine you need to make multiple calls that are asynchronous, like in this example. You need nested
fixture.whenStable()
calls, which call start to look to pretty uglyThis might look cleaner (and easier to reason about) without all those
fixture.whenStables()
Another thing I might add is the OCD part of me always needs to check that my calls in the
fixture.whenStable()
is calledImagine that you forgot to wrap the test in
async
. Without that, the test will complete before thefixture.whenStable
resolution, and you will never know it. It will look like the test passed, which is a false positive. What actually happened is that the assertion was never even called.For this reason, I've actually been moving away from
async
. But if you like that style, and trust yourself that you always wrap the test inasync
, then stick with it. But withfakeAsync
, everything is called synchronously, so there's no chance of the assertion not being called.