如何使用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
相关产品推荐
相关产品推荐

