我试图测试一个组件调用detectChanges它被注入ChangeDetectorRef
我已经逐步完成了代码,它确实被调用了,但看起来我在组件和测试中获得了不同的 ChangeDetectorRef 值。这是代码。我也试过注释掉的间谍,但它也不起作用。
it('should call ChangeDetectorRef.detectChanges from onFixedUpdate', () => {
let changeDetectorService = fixture.debugElement.injector.get(ChangeDetectorRef, null);
let spy = spyOn(changeDetectorService, 'detectChanges').and.callThrough();
//let spy = spyOn(fixture.changeDetectorRef, 'detectChanges').and.callThrough();
expect(spy).not.toHaveBeenCalled();
fixture.componentInstance.onFixedUpdate(1);
expect(spy).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
首先是一些考虑:
ChangeDetectorRef 不是通过 DI 提供的,因此您不能提供双精度值。fixture.changeDetectorRef 与提供的组件不同,因此您不能使用它。fixture.debugElement.injector.get(ChangeDetectorRef)将创建私有类的新实例ViewRef(公共类ViewRef只是 的别名ViewRef$1),每次调用它时,提供给组件的对象都是另一个。所以我的解决方案是:
const changeDetectorRef = fixture.debugElement.injector.get(ChangeDetectorRef);
const detectChangesSpy = spyOn(changeDetectorRef.constructor.prototype, 'detectChanges');
Run Code Online (Sandbox Code Playgroud)
小智 1
我遇到了同样的问题,并使用了胡安对类似问题的回答中描述的技术。
基本要点是直接监视组件中分配注入的属性ChangeDetectorRef。如果您已将此属性标记为私有(通常是这种情况),则可以通过将组件强制转换为私有属性,any然后使用它在私有属性上创建间谍来解决此问题。
请注意,我只是将其添加为评论,但我没有足够高的代表 - 我希望这没问题!
| 归档时间: |
|
| 查看次数: |
2217 次 |
| 最近记录: |