使用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
相关产品推荐
相关产品推荐

