Javascript 如何使用Sinon(spy/stub/mock)对ES6静态类进行单元测试?子函数,内部函数[JS+;SINON]

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

下面是我想用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 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();
        });
    });
});
  • 内部函数:我猜内部函数无法测试,因为无法调用/模拟,不是吗
  • 子函数:测试有效
  • 父函数:第一次测试工作,但从未调用存根函数。我试着用间谍和嘲笑,但我也不能让它工作
有人能够测试ES6静态类吗


谢谢:)

应该调用子函数
测试内部。单元测试应该检查结果。您也不会测试
internalFunc
。谢谢@zeroplagl,我同意内部函数,但mock子函数背后的原因是删除依赖项,因为子函数将单独测试,并且对该逻辑的责任已经得到处理。知道已使用正确的参数调用子函数对于父函数来说应该足够了。如果有一天您更改了
parentFunc
,使其不再调用
childFunc
,那么您必须编写一个新的单元测试。这就违背了单元测试的观点。@zeroflagL为True,但另一方面,如果子函数中出现某些中断,则当问题仅存在于子函数中时,将使父函数失败。无论如何,我只是想知道是否有一个选项来测试这些场景。谢谢:)让我们试试另一种观点。“但是存根函数永远不会被调用。”为什么要调用它?没有调用函数的代码。您只有调用childFunc的代码。但是如果
parentFunc
的签名是
(baseNum,childFunc)=>{
,那么您可以传入
stubFunction
并调用它。调用其他函数的事实也不再是一个内部细节,因此测试它可能有些意义。然后您可以轻松地测试它。