在angular2测试中,fakeAsync和async有什么区别

Ami*_*ani 20 javascript jasmine karma-jasmine angular2-testing angular

我知道tick()函数使用fakeAsync.而且我也可以使用fixture.whenStable().then()和async以及fakeAsync.我想知道两者的确切用例.任何人都可以用例子解释这一点

注意:我想在两种方案中使用虚假服务或存根.

Pau*_*tha 22

在大多数情况下,它们可以互换使用.除了外部模板和样式未内联编译到组件中进行测试(即使用SystemJS)的组件外,我无法想到除了另一个之外需要的任何东西.使用SystemJS时,会对外部模板和样式进行XHR调用.fakeAsync在进行XHR调用时无法使用.另一方面,使用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)
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

没有所有这些,这可能看起来更干净(更容易推理) fixture.whenStables()

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

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

changeSomething()
fixture.detectChanges();
tick();
expect(somethingElse);
Run Code Online (Sandbox Code Playgroud)

我可能添加的另一件事是我的OCD部分总是需要检查我的调用fixture.whenStable()是否被调用

fixture.whenStable().then(() => {
  expect(...)
  console.log('called...')
})
Run Code Online (Sandbox Code Playgroud)

想象一下,你忘了把测试包好了async.没有它,测试将在fixture.whenStable解决之前完成,你永远不会知道它.它看起来像测试通过,这是一个误报.实际发生的事情是,断言从未被调用过.

出于这个原因,我实际上已经离开了async.但是如果你喜欢那种风格,并且相信自己总是将测试包裹起来async,那就坚持下去吧.但是fakeAsync,一切都被同步调用,所以没有机会不被调用.