如何用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工具,它能在测试时动态替换模块的导出内容。
- 先安装依赖:
npm install proxyquire --save-dev
- 修改后的
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
相关产品推荐
相关产品推荐

