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

如何用Sinon和Mocha正确Stub已有main函数?Stub未生效问题

解决Sinon Stub模块导出函数不生效的问题

你当前的代码中,Stub未生效的核心原因是:你Stub的是自己创建的stubObj里的main函数引用,但实际调用的是直接从index.js解构导入的main函数,这两个是独立的函数引用,Stub无法影响原函数的调用。

下面是两种正确的实现方式:

方法一:直接Stub模块的导出对象

不要解构导入模块,保留整个模块的引用,直接Stub模块导出的main属性,这样调用模块的main时就会使用Stub后的函数。

修改后的test.js代码:

const { it, describe } = require('mocha');
const sinon = require('sinon');

// 保留整个模块的引用,不要解构导入
const indexModule = require('./index');

describe('Mock main function test', () => {
    it('should return stubbed value successfully', () =>{
       // 直接Stub模块导出的main函数,并指定返回值
       const stubMain = sinon.stub(indexModule, 'main').returns(100);

       const stubbedResult = indexModule.main();
       console.log({ stubbedResult }); // 输出 { stubbedResult: 100 }

       // 测试完成后恢复原函数,避免影响其他测试
       stubMain.restore();
    })
})

方法二:使用Proxyquire替换模块导出

如果需要更灵活的模块依赖替换,可以使用proxyquire工具,它能在测试时动态替换模块的导出内容。

  1. 先安装依赖:
npm install proxyquire --save-dev
  1. 修改后的test.js代码:
const { it, describe } = require('mocha');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('Mock main function test', () => {
    it('should return stubbed value successfully', () =>{
       // 创建Stub函数并指定返回值
       const stubbedMain = sinon.stub().returns(100);

       // 用proxyquire加载index.js,替换其导出的main函数
       const indexModule = proxyquire('./index', {
           './index': { main: stubbedMain }
       });

       const stubbedResult = indexModule.main();
       console.log({ stubbedResult }); // 输出 { stubbedResult: 100 }
    })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:35:21