如何在不传入参数的情况下存根函数内部的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
相关产品推荐
相关产品推荐

