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



考虑我有以下内容:

注意:下面显示的示例只是为了简洁起见说明了一个想法,没有考虑真实世界的用例

文件:simpleCalcs.js

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

文件:medianCalcs.js

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

文件:medianCalcs.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);
});
});

此测试失败,因为未调用存根函数。

如何确保在存根时处理module.exports = function () {....}

西农有能力满足这些要求吗??

p.S之所以使用module.exports = function () {....}而不是module.exports = {....},是因为可以通过params注入一些依赖关系。

您可以使用链接接缝,所以我将使用proxyquire来存根它。

例如

simpleCalcs.js:

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

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:

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]);
});
});

带覆盖率报告的单元测试结果:

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             
----------------|---------|----------|---------|---------|-------------------

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

最新更新