首页 > 解决方案 > 开玩笑 - 使用 spyOn 函数时,确保不调用被监视的函数

问题描述

来自 Jest 笔记:注意:默认情况下, jest.spyOn 也调用 spie 方法。

在我的 Angular 组件中。

ngAfterViewInit(): void {
  this.offsetPopoverPosition();
}

在我的规范中:

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();
  });

简单的。然而,原始函数仍在被调用。我检查了 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 问题,该问题由于某种原因已关闭而未解决。

Jest spyOn() 调用实际函数而不是模拟函数

标签: javascriptangularjestjs

解决方案


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

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

这也假设它cmp是组件的一个实例,而不仅仅是它的定义参考

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


推荐阅读