开玩笑-使用spyOn函数时,请确保未调用该间谍程序

cod*_*pic 5 javascript jestjs angular

从Jest注意:注意:默认情况下,jest.spyOn也调用spied方法。

在我的Angular组件中。

ngAfterViewInit(): void {
  this.offsetPopoverPosition();
}
Run Code Online (Sandbox Code Playgroud)

在我的规格中:

it('ngAfterViewInit() method should call offsetPopoverPosition() method', () => {
    const mockListener = jest.spyOn(cmp, 'offsetPopoverPosition');
    const spy = mockListener.mockImplementation(() => {
      console.log('in the mock');
    });

    cmp.ngAfterViewInit();
    expect(spy).toHaveBeenCalled();
  });
Run Code Online (Sandbox Code Playgroud)

简单。然而,原始功能仍在被调用。我检查了Jest 23.x文档:https : //jestjs.io/docs/en/23.x/jest-object#jestspyonobject-methodname https://jestjs.io/docs/en/23.x/mock-function -api#mockfnmockimplementationfn

互联网上的例子很少,但我无法阻止开玩笑地调用原始offsetPopoverPosition()方法。

有任何想法吗?

我交叉链接到Jest github问题,由于某种原因该问题未解决而已关闭。

开玩笑spyOn()调用实际函数,而不是模拟

Bra*_*vij 4

根据我的经验,问题是您正在重置原始模拟的意图。当你创建一个间谍时,它有自己的实现,通过用mockImplementation覆盖它,我经历过你所描述的场景 - 相反,试试这个:

cmp.offsetPopoverPosition = jest.fn().mockImplementation(() => {
      console.log('in the mock');
    });
const mockListener = jest.spyOn(cmp, 'offsetPopoverPosition');
// ... do work
expect(mockListener).toHaveBeenCalled[Times,With]()
Run Code Online (Sandbox Code Playgroud)

这还假设它cmp是组件的一个实例,而不仅仅是它的定义引用

编辑:请注意,在您正在测试的组件内部模拟消息函数是一种误导的单元测试方法。不要测试与sameComponent.method- 测试链式方法在被测试组件之外使用的任何消息传递 - 通过简短的问题内容,​​如果它的阅读茶叶与您的单元测试设计无关,请忽略我给出的测试方法建议(数)