假设我们有一个组件-具有MyComponent
更改检测策略的OnPush
,注入ChangeDetectorRef
以便手动触发detectChanges()
(例如,在订阅内或其他地方) )。
我们也对此组件进行了测试。因此,当我们获得fixture = TestBed.createComponent(MyComponent)
的实例时,我们也可以触发detectChanges()
在测试中执行数据绑定。
我的问题是-两种情况下这两种方法有什么区别?如果我在测试中触发component.changeDetecotrRef.detectChanges()
而不是触发fixture.detectChanges()
,我们可以获得相同的结果吗?
答案 0 :(得分:3)
从技术上讲,它们执行相同的操作,但是changeDetecotrRef.detectChanges()
是组件功能的一部分,而fixture.detectChanges()
是测试的填充程序。
区别在于changeDetecotrRef.detectChanges()
在已编译的Angular应用中触发更改检测,而fixture.detectChanges()
在测试环境中触发更改检测。前者旨在与完全编译的Angular应用一起使用,而后者则与旨在模拟完整Angular应用的夹具一起使用。
单元测试的#1规则是不要更改代码以适合测试,因此在需要更改检测以使组件起作用时,请在组件代码中使用changeDetecotrRef.detectChanges()
,并在预期将发生更改检测时使用fixture.detectChanges()
对测试进行匀速测试(几乎总是用于测试UI更新)