ChangeDetectorRef.detectChanges和Fixture.detectChanges之间的区别

时间:2018-08-26 00:54:11

标签: angular unit-testing jasmine angular-changedetection

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

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

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

1 个答案:

答案 0 :(得分:3)

从技术上讲,它们执行相同的操作,但是changeDetecotrRef.detectChanges()是组件功能的一部分,而fixture.detectChanges()是测试的填充程序。

区别在于changeDetecotrRef.detectChanges()在已编译的Angular应用中触发更改检测,而fixture.detectChanges()在测试环境中触发更改检测。前者旨在与完全编译的Angular应用一起使用,而后者则与旨在模拟完整Angular应用的夹具一起使用。

单元测试的#1规则是不要更改代码以适合测试,因此在需要更改检测以使组件起作用时,请在组件代码中使用changeDetecotrRef.detectChanges(),并在预期将发生更改检测时使用fixture.detectChanges()对测试进行匀速测试(几乎总是用于测试UI更新)