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

如何使用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模块:

  1. 先安装proxyquire:
npm install proxyquire --save-dev
  1. 测试代码实现:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:42