这些都是人为的例子,主要是 JavaScript,但这个问题是与语言无关的,并且通常集中在单元测试上。
代码库
function func1() {
return func2(7, 4);
}
function func2(param1, param2) {
return param1 + param2 + func3(11) + func4(14, 2, 8);
}
function func3(param1) {
return param1 + 5;
}
function func4(param1, param2, param3) {
return func5(6, 1) + param1 + param2 + param3;
}
function func5(param1, param2) {
return param1 + param2;
}
单元测试(猴子补丁样式)
function func2_stub(param1, param2) {
return 5;
}
monkey_patch(func2, func2_stub);
assert(func1() == 5);
问题
- 测试与实现紧密耦合。
- 在某些语言中可能无法进行猴子修补。
- 未经测试的副作用依赖项更改不会破坏现有测试(即静默和未修补的依赖项)。
单元测试(依赖倒置/注入风格)
我了解依赖反转/注入、存根、伪造、模拟等的概念,但尚未在现实世界的多级函数调用中遇到它。即到目前为止,我所看到的示例仅显示了调用者和被调用者。
这就是我将其推断为两个以上的级别:
// Refactored code
function func1() {
return func2(func3, func4, func5, 7, 4);
}
function func2(dependent1, dependent2, dependent3, param1, param2) {
return param1 + param2 + dependent1(11) + dependent2(dependent3, 14, 2, 8);
}
function func3(param1) {
return param1 + 5;
}
function func4(dependent1, param1, param2, param3) {
return dependent1(6, 1) + param1 + param2 + param3;
}
function func5(param1, param2) {
return param1 + param2;
}
// Tests
function func5_stub(param1, param2) {
return 5;
}
assert(func4(func5_stub, 1, 2, 3) == 11);
问题
- 测试与实现紧密耦合。
- 顶级函数因未使用的参数而臃肿(只是传递下来)。
- 您如何测试最高级别的函数(在这种情况下为 func1)?每次反转依赖关系时,都会无意中创建另一个级别。
问题
在现实世界中进行单元测试(即深层函数调用)时,处理存根依赖关系的最佳方法或策略是什么?