监视 ChangeDetectorRef.detectChanges

maj*_*ibu 6 angular

我试图测试一个组件调用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)

Ale*_*oti 7

首先是一些考虑:

  1. ChangeDetectorRef 不是通过 DI 提供的,因此您不能提供双精度值。
  2. fixture.changeDetectorRef 与提供的组件不同,因此您不能使用它。
  3. 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)

  • 这应该是公认的答案。 (3认同)

小智 1

我遇到了同样的问题,并使用了胡安对类似问题的回答中描述的技术。

基本要点是直接监视组件中分配注入的属性ChangeDetectorRef。如果您已将此属性标记为私有(通常是这种情况),则可以通过将组件强制转换为私有属性,any然后使用它在私有属性上创建间谍来解决此问题。

请注意,我只是将其添加为评论,但我没有足够高的代表 - 我希望这没问题!