[英]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.