如何使用 Sinon 存根 npm 包 `phin`
Posted
技术标签:
【中文标题】如何使用 Sinon 存根 npm 包 `phin`【英文标题】:How to stub npm package `phin` with Sinon 【发布时间】:2021-12-19 11:32:51 【问题描述】:我正在尝试存根 npm 包 phin
,但运气不佳。请问有什么建议吗?
以下是代码的简化版本。
requestHelper.js
const phin = require('phin');
async function request(req)
return await phin(req);
module.exports = request
requestHelper.test.js
const requestHelper = require('./requestHelper.js');
const phin = require('./node_modules/phin');
sinon.stub(phin.prototype, 'constructor').returns(true);
const result = await requestHelper.request("something":"something")
expect(result).to.eql(true);
sinon.stub(phin.prototype, 'constructor').returns(true)
=>
错误:试图存根未定义的属性“构造函数”
【问题讨论】:
您发布的 javascript 中的语法错误是否存在复制/粘贴问题? @CarlMarkham 是的复制/粘贴问题;我现在已经解决了。当我使用sinon.stub(phin.prototype, 'constructor').returns(true)
=> Error: Trying to stub property 'constructor' of undefined
时,我仍然遇到同样的错误
我可以使用rewire
,但如果可以避免,我会尽量避免引入另一个模块。 const requestHelper = rewire('./requestHelper.js');
requestHelper.__set__('phin', sinon.stub().returns(true));
【参考方案1】:
由于 sinon 不支持从模块导入存根独立函数,Possible to stub a standalone utility function?。您可以使用proxyquire 来执行此操作。
另外,我创建了一个演示,没有安装phin
包,所以我禁用了proxyquire
的callThru。
如果 callThru 被禁用,您可以删除运行测试的机器上甚至不存在的模块
requestHelper.js
:
const phin = require('phin');
async function request(req)
return await phin(req);
module.exports = request ;
requestHelper.test.js
:
const proxyquire = require('proxyquire').noCallThru();
const sinon = require('sinon');
describe('69852777', () =>
it('should pass', async () =>
const phinStub = sinon.stub().resolves(true);
const requestHelper = proxyquire('./requestHelper',
phin: phinStub,
);
const result = await requestHelper.request( something: 'something' );
sinon.assert.match(result, true);
sinon.assert.calledWithExactly(phinStub, something: 'something' );
);
);
测试结果:
69852777
✓ should pass (1581ms)
1 passing (2s)
------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
------------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
requestHelper.js | 100 | 100 | 100 | 100 |
------------------|---------|----------|---------|---------|-------------------
【讨论】:
以上是关于如何使用 Sinon 存根 npm 包 `phin`的主要内容,如果未能解决你的问题,请参考以下文章