简体   繁体   English

如何存根模块中导出的函数返回的对象

[英]How to stub an object returned by function exported in the module

consider I have the following:考虑我有以下几点:

Note: The examples shown below just illustrate an idea for brevity and doesn't consider real world use case注意:下面显示的示例只是为了简洁起见,并未考虑现实世界的用例

File: simpleCalcs.js文件:simpleCalcs.js

module.exports = function () {
    return {
        sum: (listOfNumbers) => {
            console.log('inside test2 sum()');
            return listOfNumbers.reduce((a, b) => a + b, 0);
        }
    }
};

File: mediumCalcs.js文件:mediumCalcs.js

const simpleCalcs = require('./simpleCalcs')();

module.exports = function () {
    return {
        avg: (listOfNumbers) => {
            console.log('inside test1 avg()')
            return simpleCalcs.sum(listOfNumbers) / listOfNumbers.length;
        }
    }
};

File: mediumCalcs.test.js文件:mediumCalcs.test.js

const sinon = require('sinon');
const expect = require('chai').expect;
const simpleCalcs = require('./simpleCalcs')();
const mediumCalcs = require('./mediumCalcs')();

describe('sample test', () => {

    before(() => {
        summationStub = sinon.stub(simpleCalcs, 'sum').returns(3);
    });

    it('average', () => {
        const result = mediumCalcs.avg([1, 2, 3]);
        expect(result).to.be.equal(1);
    });
});

This test fails as the stubbed function is not called.此测试失败,因为未调用存根函数。

How do I ensure that the module.exports = function () {....} is taken care of while stubbing?如何确保在module.exports = function () {....}

Is sinon capable of handling such requirements?? sinon有能力处理这样的要求吗??

PS The reason module.exports = function () {....} is used instead of module.exports = {....} is because one can inject some dependencies via params. PS 使用module.exports = function () {....}而不是module.exports = {....}的原因是因为可以通过 params 注入一些依赖项。

You can use link seams , so I will use proxyquire to stub it.您可以使用链接接缝,因此我将使用proxyquire存根它。

Eg例如

simpleCalcs.js : simpleCalcs.js

module.exports = function() {
  return {
    sum: (listOfNumbers) => {
      console.log('inside test2 sum()');
      return listOfNumbers.reduce((a, b) => a + b, 0);
    },
  };
};

mediumCalcs.js : mediumCalcs.js

const simpleCalcs = require('./simpleCalcs')();

module.exports = function() {
  return {
    avg: (listOfNumbers) => {
      console.log('inside test1 avg()');
      return simpleCalcs.sum(listOfNumbers) / listOfNumbers.length;
    },
  };
};

mediumCalcs.test.js : mediumCalcs.test.js

const sinon = require('sinon');
const expect = require('chai').expect;
const proxyquire = require('proxyquire');

describe('sample test', () => {
  it('average', () => {
    const simpleCalcsStub = {
      sum: sinon.stub().returns(3),
    };
    const simpleCalcs = sinon.stub().callsFake(() => simpleCalcsStub);
    const mediumCalcs = proxyquire('./mediumCalcs.js', {
      './simpleCalcs': simpleCalcs,
    })();
    const result = mediumCalcs.avg([1, 2, 3]);
    expect(result).to.be.equal(1);
    sinon.assert.calledOnce(simpleCalcs);
    sinon.assert.calledWithExactly(simpleCalcsStub.sum, [1, 2, 3]);
  });
});

unit test results with coverage report:带有覆盖率报告的单元测试结果:

  sample test
inside test1 avg()
    ✓ average (1613ms)


  1 passing (2s)

----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |      60 |      100 |      40 |   66.67 |                   
 mediumCalcs.js |     100 |      100 |     100 |     100 |                   
 simpleCalcs.js |      20 |      100 |       0 |      25 | 2,4,5             
----------------|---------|----------|---------|---------|-------------------

source code: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60746613源代码: https : //github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60746613

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM