首页 > 解决方案 > 在另一个函数内部调用函数

问题描述

使用工厂模式,我编写了使用 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()功能,我能做什么?

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

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

标签: javascriptunit-testingjestjs

解决方案


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

解决此代码异味的一种方法是使用Dependency Injection。这样,您将同时提供sumandmultiply函数,但函数的接口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 函数进行单元测试。更好的是,我们现在sum可以multiplysumAndMultiply.


推荐阅读