使用 sinon 存根私有函数

stub a private function using 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,
    })(() => {
      const actual = mod.outer();
      sinon.assert.match(actual, 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                 
--------------------|---------|----------|---------|---------|-------------------