繁体   English   中英

在另一个 function 内部调用 function

[英]Call function inside of another function

使用工厂模式,我编写了使用 firebase 云函数的代码片段:

//Notice that when instantiated it does calculations and returns a value
function sumAndMultiply(int number) {
    function sum(i) {
        return i + 1;
    }
    function multiply(i) {
        return i * 3;
    }

    const x = sum(number);
    const y = multiply(x);
    return y;
}

everting 工作正常,但是,如果我需要对multiply()sum() function 进行单元测试,我能做什么?

describe('Unit testing', () => {

    it('test sum function', () => {

        //How i can call sum function without call sumAndMultiply?
        let result = sum(3);
        expect(result == 4);
    });

    it('test multiply function', () => {

        //How i can call multiply function without call sumAndMultiply?
        let result = multiply(3);
        expect(result == 9);
    });
});

正如我在谈论单元测试时,一个想法是避免编辑用于生产的代码,但可以接受使代码更具可读性或更好的更改

您的方法的问题在于您的代码与 sum 和 multiply 函数的实现紧密耦合。 这使得测试变得更加困难,并且测试求和和乘法的单位需要付出很多努力。

解决此代码异味的一种方法是使用Dependency Injection 这样,您将同时提供summultiply函数,但sumAndMultiply函数的接口需要更改。 这样,您的代码将变为:

 //Notice that when instantiated it does calculations and returns a value function sumAndMultiply(number, sum, multiply) { const x = sum(number); const y = multiply(x); return y; } function sum(i) { return i + 1; } function multiply(i) { return i * 3; }

这样,您注入这些功能。 好消息是,现在我们可以按照您的建议对 sum 和 multiply 函数进行单元测试。 更好的是,我们现在可以在sumAndMultiply上模拟summultiply函数。

暂无
暂无

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

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