我有一个以下格式的节点模块
'use strict’;
/// require dependencies here
function outerFunc1(a, b, c) {
function f1() {
return f2()
}
function f2() {
return 2
}
f1();
}
const choose = (type) => {
let funcToCall
switch (type) {
case "func1":
funcToCall = outerFunc1;
break;
}
return funcToCall;
}
module.exports = (function () {
return {
choose
};
})();
任何人都可以告诉我如何单元测试函数f2和f1,或者换句话说我如何调用它,是否有任何方法可以实现相同,如使用反射api或任何其他方式使用重新连接或sinon?
f1
和f2
的所有功能都可以通过公共API函数间接激发。因此,没有充分的理由自己测试它们。相反,有理由再次对它们进行自我测试:每当outerFunc1
的实施发生变化时,f1
或f2
以打破测试的方式受到影响的可能性似乎很高。
但请注意,我并不反对测试实现细节:您应该设计测试,以便找到所有潜在的错误 - 这意味着您应该考虑实现细节。单元测试是正确的方法,因为它的目的正是使用白盒知识测试代码中最小的可测试实体。例如,当您使用分支覆盖率分析来查看是否错过了某些测试时,您正在利用有关代码控制结构的白盒知识。
有些人认为你不应该测试实现,而只测试行为。原因是否则测试套件会变得脆弱。虽然避免测试套件变得不必要地脆弱无疑是一个有效的目标,但它并不是最优先考虑的问题。最高优先级是IMO,可以找到生产代码中的所有错误。这也需要测试实现细节。
如果某些计算使用缓存来更快地重新生成已经计算的结果,那么从用户的角度来看,这将是一个实现细节。但是,当然,缓存算法可能包含错误,因此应该测试缓存。更一般地说,更大系统的每个子系统(小或大)都可以看作是更大系统的实现细节。但这并不意味着测试只应在最外层的系统边界上进行。