如何使用Sinon在单元测试中Stub blue依赖的yellow函数?
正确Stub yellow函数的方案
你的问题核心在于:yellow.js导出的是单个函数(默认导出),而非包含该函数的对象,所以直接用sinon.stub(Yellow, 'yellow')这种对象属性Stub方式必然报错——因为Yellow本身就是那个函数,不是拥有yellow属性的对象。
下面提供两种可行方案,按需选择:
方案1:修改模块导出方式(推荐,代码结构更清晰)
调整yellow.js为命名导出
async function yellow(prop1, prop2) { // 原有逻辑 return [1, 2, 3] } module.exports = { yellow } // 导出包含函数的对象
调整blue.js的导入逻辑
const { yellow } = require('./yellow') // 解构导入命名导出的函数 async function blue(prop1, prop2) { const getIds = await yellow(prop1, prop2) // 原有逻辑 return [1, 2, 3] }
测试代码中Stub
const sinon = require('sinon') const { yellow } = require('./yellow') const blue = require('./blue') it('should return an array of ids', async () => { // Stub yellow函数,指定返回值 const yellowStub = sinon.stub(yellow).resolves([4, 5, 6]) const result = await blue(1, 2) // 验证Stub被正确调用 sinon.assert.calledWith(yellowStub, 1, 2) // 验证blue函数的返回结果(根据你的业务逻辑调整断言) expect(result).toEqual([1, 2, 3]) })
方案2:不修改原代码,用proxyquire替换依赖
如果不想改动原有业务代码,可以用proxyquire在测试时替换blue.js依赖的yellow模块:
- 先安装proxyquire:
npm install proxyquire --save-dev
- 测试代码实现:
const sinon = require('sinon') const proxyquire = require('proxyquire') it('should return an array of ids', async () => { // 创建yellow函数的Stub,指定返回值 const yellowStub = sinon.stub().resolves([4, 5, 6]) // 用proxyquire加载blue模块,替换其依赖的'./yellow'为我们的Stub const blue = proxyquire('./blue', { './yellow': yellowStub }) const result = await blue(1, 2) // 验证Stub被调用 sinon.assert.calledWith(yellowStub, 1, 2) // 验证blue的返回结果 expect(result).toEqual([1, 2, 3]) })
内容的提问来源于stack exchange,提问作者saber1897
相关产品推荐
相关产品推荐

