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

使用Jest spyOn监听同文件内部函数失败,调用次数为0如何解决?

问题根因

jest.spyOn监听的是导出的functions对象上挂载的bar方法,而foo函数内部直接调用的是functions.js文件作用域下声明的局部bar函数,两者只是初始值指向同一个函数实体,属于完全独立的两个引用。你调用functions.foo()时触发的是局部bar的执行,没有触发你监听过的functions.bar,因此调用次数统计为0。

另外你原代码的导出语法存在错误,export functions = {缺少变量声明关键字,需修正为export const functions = {才能正常运行。

解决方案

方案1:最小改动适配监听逻辑

修改foo内部调用逻辑,调用当前执行上下文的bar方法,触发你监听的对象方法:

// functions.js 修改后
function bar() {
  return 'bar';
}

function foo() {
  return this.bar();
}

export const functions = {
  bar,
  foo,
};

测试代码无需改动,直接运行即可通过。

方案2:拆分导出避免作用域问题

将方法单独导出,直接监听模块导出的方法引用:

// functions.js 修改后
export function bar() {
  return 'bar';
}

export function foo() {
  return bar();
}

测试代码调整为监听模块导出对象:

// functions.test.js 修改后
import * as funcModule from './functions.js';

describe('test foo', () => {
  it('should call bar', () => {
    const spy = jest.spyOn(funcModule, 'bar');
    funcModule.foo();
    expect(spy).toHaveBeenCalled();
  });
});

方案3:不改动业务代码适配测试

直接在测试时绑定foo的执行上下文为导出的functions对象:

// functions.test.js 修改后
import {functions} from './functions.js';

describe('test foo', () => {
  it('should call bar', () => {
    const spy = jest.spyOn(functions, 'bar');
    functions.foo.bind(functions)();
    expect(spy).toHaveBeenCalled();
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:15:03