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

如何使用Sinon对npm包phin进行stub?undefined报错如何解决?

问题根因

phin 包默认导出的是普通可调用异步函数,并非构造函数或类,不存在 prototype 属性,phin.prototype 本身取值就是 undefined,因此你尝试 stub 其下的 constructor 属性时会抛出对应错误。

可行解决方案

方案1:直接通过模块缓存 stub phin

调整模块引入顺序,先完成phin的stub再引入requestHelper,避免requestHelper提前加载原始phin:

const sinon = require('sinon');
const { expect } = require('chai');

// 先加载phin并stub导出
const phin = require('phin');
const phinStub = sinon.stub().resolves(true);
sinon.stub(require.cache[require.resolve('phin')], 'exports').value(phinStub);

// stub完成后再引入requestHelper
const requestHelper = require('./requestHelper.js');

// 测试逻辑
const result = await requestHelper.request({"something":"something"});
expect(result).to.eql(true);
// 可校验调用参数是否正确
expect(phinStub.calledOnceWith({"something":"something"})).to.be.true;

// 测试结束后恢复缓存,避免影响其他用例
after(() => {
  require.cache[require.resolve('phin')].exports.restore();
});

方案2:通过proxyquire替换依赖(更稳定,无缓存污染风险)

使用proxyquire可以直接指定requestHelper加载的phin依赖为你的stub方法,无需处理模块缓存:

const sinon = require('sinon');
const { expect } = require('chai');
const proxyquire = require('proxyquire');

// 构造phin stub
const phinStub = sinon.stub().resolves(true);
// 引入requestHelper时直接替换其依赖的phin包
const requestHelper = proxyquire('./requestHelper.js', {
  'phin': phinStub
});

// 测试逻辑
const result = await requestHelper.request({"something":"something"});
expect(result).to.eql(true);
expect(phinStub.calledOnceWith({"something":"something"})).to.be.true;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:24:03