使用sinon存根私有函数

问题描述

我想对给定文件未公开的函数进行存根。

我的代码如下:

const inner = function inner(){
    return Math.random()
}

const outer = function outer(){
    if (inner()>0.5)
        return true
    return false
}

module.exports = {
    outer,}

要测试外部方法,我需要将内部方法存根。 到目前为止我尝试过的:

const sinon = require('sinon')
const filetoBeTested = require('./my-tiny-example')

sinon.stub(filetoBeTested,'inner')
     .returns(0.9)
console.log(filetoBeTested.outer())

我得到的错误

TypeError: Cannot stub non-existent property inner

考虑到我正在使用sinon进行存根,任何建议。

谢谢

解决方法

您可以使用rewire软件包对inner函数进行存根,而无需将其导出。

例如

my-tiny-example.js

const inner = function inner() {
  return Math.random();
};

const outer = function outer() {
  if (inner() > 0.5) return true;
  return false;
};

module.exports = {
  outer,};

my-tiny-example.test.js

const rewire = require('rewire');
const sinon = require('sinon');

describe('64741353',() => {
  it('should return true',(done) => {
    const mod = rewire('./my-tiny-example');
    const innerStub = sinon.stub().returns(1);
    mod.__with__({
      inner: innerStub,})(() => {
      const actual = mod.outer();
      sinon.assert.match(actual,true);
      done();
    });
  });
  it('should return true',(done) => {
    const mod = rewire('./my-tiny-example');
    const innerStub = sinon.stub().returns(0);
    mod.__with__({
      inner: innerStub,false);
      done();
    });
  });
});

单元测试结果:

  64741353
    ✓ should return true (68ms)
    ✓ should return true


  2 passing (123ms)

--------------------|---------|----------|---------|---------|-------------------
File                | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------------|---------|----------|---------|---------|-------------------
All files           |   85.71 |      100 |      50 |   83.33 |                   
 my-tiny-example.js |   85.71 |      100 |      50 |   83.33 | 2                 
--------------------|---------|----------|---------|---------|-------------------