javascript - 在另一个函数内部调用函数
问题描述
使用工厂模式,我编写了使用 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);
});
});
正如我在谈论单元测试时,一个想法是避免编辑用于生产的代码,但可以接受使代码更具可读性或更好的更改
解决方案
您的方法的问题在于您的代码与 sum 和 multiply 函数的实现紧密耦合。这使得测试变得更加困难,并且测试求和和乘法的单位需要付出很多努力。
解决此代码异味的一种方法是使用Dependency Injection。这样,您将同时提供sum
andmultiply
函数,但函数的接口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
可以multiply
在sumAndMultiply
.