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

如何在不传入参数的情况下存根函数内部的compose函数?

用Proxyquire存根compose函数的实现方案

要在不修改原代码的前提下存根compose函数,你可以借助Proxyquire直接替换目标模块的依赖,具体步骤如下:

假设原模块文件为complicated.js(补全你代码里缺失的闭合大括号):

const { compose } = require('./compose');

const complicatedFunction = async function (argA, argB) {
    const result = await getValue(argA);
    const value = await getValue2(argB);
    const composition = compose(result, value);
    validator(composition);
    return composition;
};

module.exports = { complicatedFunction };

测试文件(以Mocha+Sinon为例):

首先安装必要依赖:

npm install proxyquire sinon --save-dev

编写测试代码complicated.test.js:

const proxyquire = require('proxyquire');
const sinon = require('sinon');

describe('complicatedFunction', () => {
  it('验证validator接收compose存根的返回值', async () => {
    // 1. 创建compose的存根,指定任意返回值
    const stubbedCompose = sinon.stub().returns('自定义测试值');

    // 2. 存根其他异步依赖(避免测试卡住)
    const stubGetValue = sinon.stub().resolves('模拟result');
    const stubGetValue2 = sinon.stub().resolves('模拟value');
    // 存根validator用于验证调用
    const stubValidator = sinon.stub();

    // 3. 用Proxyquire加载目标模块,替换所有需要模拟的依赖
    const { complicatedFunction } = proxyquire('./complicated', {
      './compose': { compose: stubbedCompose }, // 替换compose依赖
      // 假设getValue、getValue2、validator来自同一工具模块,按需替换
      './utils': {
        getValue: stubGetValue,
        getValue2: stubGetValue2,
        validator: stubValidator
      }
    });

    // 4. 调用待测试函数
    await complicatedFunction('testA', 'testB');

    // 5. 验证逻辑:检查validator是否收到了compose存根的返回值
    sinon.assert.calledWith(stubValidator, '自定义测试值');
  });
});

关键细节说明:

  • Proxyquire的核心是替换模块的require依赖:第二个参数的键是原模块中require的路径,值是你要模拟的导出内容。如果compose是默认导出(比如module.exports = compose),替换时直接写'./compose': stubbedCompose即可,不用包对象。
  • 必须存根getValue和getValue2:因为原函数是异步的,这两个函数返回Promise,测试时需要让它们立即resolve,否则测试会阻塞。
  • 存根validator是为了验证它确实接收到了compose的返回值,这也是你测试的核心目的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:23