Angular fixture.whenStable()如果不在异步测试执行区域内,是否在角度测试中实际执行任何操作?

Angular fixture.whenStable()如果不在异步测试执行区域内,是否在角度测试中实际执行任何操作?,angular,unit-testing,Angular,Unit Testing,我最近读了很多关于角度测试的书,这些对总是async+fixture.whenStable和fakeAsync+tick,但是你总是可以调用fixtrue.whenStable,因为它不是紧密耦合的。如果您在不使用async实用程序跟踪测试区域中的承诺时调用它,它实际上会做什么 例如: it('should be able to do this thing that needs some async setup', () => { fixture.detectCha

我最近读了很多关于角度测试的书,这些对总是async+fixture.whenStable和fakeAsync+tick,但是你总是可以调用fixtrue.whenStable,因为它不是紧密耦合的。如果您在不使用async实用程序跟踪测试区域中的承诺时调用它,它实际上会做什么

例如:

it('should be able to do this thing that needs some async setup', () => {
            fixture.detectChanges();
            fixture.whenStable().then()
});
我理解
FakeAsync/Tick
fixture.detectChanges
之间的区别。我的问题是关于
fixture.whenstable
FakeAsync
执行区域内时会做什么,因为
Async
区域应该跟踪异步工作,从而允许
fixture.whenstable
钩住该跟踪,至少据我所知。或者,如果使用了异步执行区域,则根本不在异步执行区域内

因此,如果fixture.whenstable用于FakeAsync函数或未设置异步执行区域的函数中,它会按预期工作吗?

否如果在没有
async
FakeAsync
的情况下进行测试,则
whenstable()
不会执行任何操作。
whenStable()
所做的是等待测试
NgZone
中的所有任务完成。如果不使用async进行测试,则根本不会创建
NgZone
,而
whenStable()
会立即返回


如果您想了解更多详细信息,请查看中的ComponentFixture代码。

在编写时,公认的答案可能是正确的,但到2020年底,当使用
节点模块/zone.js/bundles/zone testing.umd.js时,我认为不再正确。我在文档中找不到引文,但我可以通过实验确认始终使用测试区,并且
whenStable
等待其任务完成

这是非常简单的尝试自己。只需创建一个空测试,然后添加

//// In my.component.ts
import { timer } from "rxjs";
import { map } from "rxjs/operators";

@Component({
  template: `<p>{{clock|async}}</p>,
  ...
})
export class MyComponent {
  /** @internal */ public readonly clock = timer(0,1000).pipe(map(() => new Date()));
}


//// In `my.component.spec.ts`
beforeEach(async () => {
    testBed.configureTestingModule(...);
    await testBed.compileComponents();
    fixture = testBed.createComponent(MyComponent);
    await fixture.whenStable();
});
////在my.component.ts中
从“rxjs”导入{timer};
从“rxjs/operators”导入{map};
@组成部分({
模板:`{{clock | async}

,, ... }) 导出类MyComponent{ /**@internal*/public readonly clock=timer(01000).pipe(映射(()=>newdate()); } ////在'my.component.spec.ts'中` beforeach(异步()=>{ 配置测试模块(…); 等待testBed.compileComponents(); fixture=testBed.createComponent(MyComponent); 等待fixture.whenStable(); });

因为rxjs
timer
在引擎盖下使用了
setInterval
,它被标记为总是有一个挂起的任务,所以
whenStable
永远不会解析。Jasmine将超时失败,等待安装方法返回的承诺得到解决。(问我是如何发现的…

fakeAsync是否设置了whenstable()可以使用的区域?是的,
fakeAsync()
async()
都创建了一个区域。