如何使用 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 包,所以我禁用了proxyquirecallThru

如果 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`的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sinon 存根/模拟从“超类”复制的依赖项方法

轻松清理 sinon 存根

使用 Sinon 存根 window.location.href

用 sinon 模拟/存根猫鼬 findById

使用 sinon 为 redux 操作存根闭包函数

用 sinon 存根,用 chai 测试