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

如何在Karma中模拟(mock)JavaScript文件内声明的本地函数

解决方案

本地定义的foo和bar函数的mock方案,取决于两者的作用域范围,常用可行方式如下:

  • 若函数定义在全局作用域(未包裹在闭包、模块内部)
    此时foo、bar会默认挂载到window对象上,直接用和mockdocument.A一致的语法即可:

    // mock foo 函数,可自定义返回值、调用逻辑
    sandbox.stub(window, 'foo').returns('mock 结果');
    // mock bar 函数同理
    sandbox.stub(window, 'bar').callsFake(() => {
      // 自定义 mock 逻辑
    });
    

    测试完成后sandbox会自动恢复原有函数实现。

  • 若函数定义在ES模块/CommonJS模块内部
    你需要先将两个函数从模块中导出,之后对导出的模块方法进行stub即可:
    原模块代码示例:

    // yourModule.js
    const varA = document.A;
    // 调用foo、bar的逻辑
    export function runLogic() {
      foo();
      bar();
      return varA;
    }
    
    export function foo() {}
    export function bar() {}
    

    测试代码示例:

    import * as yourModule from './yourModule.js';
    
    // stub 模块导出的foo方法
    sandbox.stub(yourModule, 'foo').returns('mock值');
    
  • 若为不对外导出的模块内部私有函数
    没有直接从外部mock的方案,你可以改造原代码,将依赖改为可注入形式:把foo、bar作为上层逻辑的可选参数传入,默认值为原本地函数,测试时直接传入自定义mock函数即可,无需依赖stub工具:
    改造后代码示例:

    // 原调用foo、bar的逻辑
    function runLogic(fooImpl = foo, barImpl = bar) {
      fooImpl();
      barImpl();
      return varA;
    }
    

内容的提问来源于stack exchange,提问作者v.slobodzian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:01