Angular fixture.whenStable()如果不在异步测试执行区域内,是否在角度测试中实际执行任何操作?
我最近读了很多关于角度测试的书,这些对总是async+fixture.whenStable和fakeAsync+tick,但是你总是可以调用fixtrue.whenStable,因为它不是紧密耦合的。如果您在不使用async实用程序跟踪测试区域中的承诺时调用它,它实际上会做什么 例如: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
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();
});
因为rxjstimer
在引擎盖下使用了setInterval
,它被标记为总是有一个挂起的任务,所以whenStable
永远不会解析。Jasmine将超时失败,等待安装方法返回的承诺得到解决。(问我是如何发现的…fakeAsync是否设置了whenstable()可以使用的区域?是的,fakeAsync()
和async()
都创建了一个区域。