无法在Jest中模拟Renderer2

时间:2019-06-03 14:18:04

标签: angular unit-testing jestjs tdd bdd

试图在Jest环境中模拟Renderer2,但无法使其正常工作。 Jest 23&Angular 7.试过了一切:

component.ts

const icosahedron = document.getElementById('renderIcosahedron');
this.renderer2.appendChild(icosahedron, this.renderer.domElement);

始终获取错误(仅在测试中):

TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

编辑:更详细的解释已添加到Angular的回购中,但被拒绝为bug。链接:https://github.com/angular/angular/issues/30865#issue-452458779

1 个答案:

答案 0 :(得分:1)

您可以将组件构造函数称为,而不是通过TestBed创建组件对象,

const renderer2 = { setStyle: () => {}, removeStyle: () => {} } as any;
    const myComponent: MyComponent= new MyComponent(
      {} as ChangeDetectorRef,
      renderer2 as Renderer2,
      {} as NgZone
    );

    const setStyleSpy = jest.spyOn(renderer2, "setStyle");

让我们说,如果应该在异步调用中调用renderer2逻辑,则可以模拟该异步调用函数,并测试在发生异步操作时是否调用了该函数。然后可以将该功能作为其他规范的一部分单独调用并测试渲染逻辑。