Javascript 如何使用Sinon(spy/stub/mock)对ES6静态类进行单元测试?子函数,内部函数[JS+;SINON]
下面是我想用Chai、Sinon和Mocha测试的静态类的简化版本。它公开了2个函数,并具有另一个内部函数Javascript 如何使用Sinon(spy/stub/mock)对ES6静态类进行单元测试?子函数,内部函数[JS+;SINON],javascript,unit-testing,ecmascript-6,sinon,static-class,Javascript,Unit Testing,Ecmascript 6,Sinon,Static Class,下面是我想用Chai、Sinon和Mocha测试的静态类的简化版本。它公开了2个函数,并具有另一个内部函数 //demo.js const parentFunc = (baseNum) => { return childFunc(baseNum, 10); }; const childFunc = (base, extra) => { const sum = base + extra; return internalFunc(sum); }; const
//demo.js
const parentFunc = (baseNum) => {
return childFunc(baseNum, 10);
};
const childFunc = (base, extra) => {
const sum = base + extra;
return internalFunc(sum);
};
const internalFunc = (num) => {
return 100 + num;
};
module.exports = {
parentFunc: parentFunc,
childFunc: childFunc
}
逻辑是不相关的,我想知道的是如何监视、存根或模拟类的所有函数,以获得完整的UT覆盖
下面是我想要做的测试用例
import DemoUtils from '../../src/scripts/common/demo';
import sinon from 'sinon';
import chai from 'chai';
const assert = chai.assert;
const expect = chai.expect;
describe('Demo', () => {
describe('Internal Function', () => {
//const res = DemoUtils.internalFunc(8);
});
describe('Child Function', () => {
it('should return ', () => {
const res = DemoUtils.childFunc(5,10);
assert.equal(res, 115);
});
});
describe('Parent Function', () => {
it('should return 140', () => {
const res = DemoUtils.parentFunc(30);
assert.equal(res, 140);
});
it('should call the child function', () => {
const stubFunction = sinon.stub(DemoUtils, 'childFunc');
stubFunction.returns(13);
const res = DemoUtils.parentFunc(30);
assert.equal(res, 13);
assert.equal(stubFunction.calledOnce, true);
stubFunction.restore();
});
});
});
- 内部函数:我猜内部函数无法测试,因为无法调用/模拟,不是吗
- 子函数:测试有效
- 父函数:第一次测试工作,但从未调用存根函数。我试着用间谍和嘲笑,但我也不能让它工作
谢谢:)
应该调用子函数
测试内部。单元测试应该检查结果。您也不会测试internalFunc
。谢谢@zeroplagl,我同意内部函数,但mock子函数背后的原因是删除依赖项,因为子函数将单独测试,并且对该逻辑的责任已经得到处理。知道已使用正确的参数调用子函数对于父函数来说应该足够了。如果有一天您更改了parentFunc
,使其不再调用childFunc
,那么您必须编写一个新的单元测试。这就违背了单元测试的观点。@zeroflagL为True,但另一方面,如果子函数中出现某些中断,则当问题仅存在于子函数中时,将使父函数失败。无论如何,我只是想知道是否有一个选项来测试这些场景。谢谢:)让我们试试另一种观点。“但是存根函数永远不会被调用。”为什么要调用它?没有调用函数的代码。您只有调用childFunc的代码。但是如果parentFunc
的签名是(baseNum,childFunc)=>{
,那么您可以传入stubFunction
并调用它。调用其他函数的事实也不再是一个内部细节,因此测试它可能有些意义。然后您可以轻松地测试它。