You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jest.spyOn测试函数调用次数未捕获到调用的问题

问题根源

在utilities.ts中,two函数直接调用的是模块内部的one函数,而非通过模块导出的引用调用。Jest的spyOn仅能监视导出的函数引用,无法替换模块内部直接调用的原始函数,因此你的spy完全没被触发,导致调用次数统计为0。

解决方案

方案一:修改工具类代码,让内部调用导出的引用

调整utilities.ts,让two通过模块自身的导出对象调用one:

export const one = (someParam: Object) => {
  // some logic
}

// 引入模块自身的导出
import * as self from './utilities';

export const two = (someArr: Object[]) => {
  const modifiedValues = [];
  for(const i of someArr) {
    // 使用导出的self.one替代直接调用one
    modifiedValues.push(self.one(i));
  }
  return modifiedValues;
}

修改后,two调用的是模块导出的one引用,你的原测试代码就能正常工作,spyOn会正确统计调用次数。

方案二:不修改原代码,用jest.mock结合requireActual实现局部mock

如果你不想改动工具类代码,可以用jest.mock仅mockone函数,保留其他函数的实际实现:

import * as utils from '../utils';

// 保留模块其他函数的真实逻辑,仅mock one
jest.mock('../utils', () => {
  const actualUtils = jest.requireActual('../utils');
  return {
    ...actualUtils,
    one: jest.fn()
  };
});

test('two函数调用one函数3次', () => {
  utils.two([{}, {}, {}]);
  expect(utils.one).toHaveBeenCalledTimes(3);
});

这种方式既满足你保留其他功能的需求,也能准确统计one的调用次数。

内容的提问来源于stack exchange,提问作者Dan L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:20:29