0

假设我们有一个组件 -MyComponent带有OnPush更改检测策略,该策略注入ChangeDetectorRef 以手动触发detectChanges()(例如在订阅内或其他地方)。

我们也对这个组件进行了测试。所以当我们得到fixture = TestBed.createComponent(MyComponent)- 的实例时,我们也可以detectChanges()在我们的测试中触发执行数据绑定。

我的问题是 - 这两种方法在这两种情况下有什么区别?如果我component.changeDetecotrRef.detectChanges()在测试中触发而不是触发,我们可以获得相同的结果fixture.detectChanges()吗?

4

1 回答 1

4

它们在技术上做同样的事情,但changeDetecotrRef.detectChanges()它是一个组件功能,同时fixture.detectChanges()是一个用于测试的垫片。

不同之处在于changeDetecotrRef.detectChanges()在编译的 Angular 应用中fixture.detectChanges()触发变更检测,而在测试环境中触发变更检测。前者旨在与完全编译的 Angular 应用程序一起使用,而后者与旨在模拟完整 Angular 应用程序的夹具一起使用。

单元测试的第一条规则是不更改代码以适应测试,因此changeDetecotrRef.detectChanges()当您需要更改检测以使组件运行时在组件代码中使用,并fixture.detectChanges()在预期发生更改检测时用于填充测试(例如模拟用户输入,或者实际上,就像调用changeDetecotrRef.detectChanges()组件一样)。

于 2018-08-26T01:34:51.357 回答