考虑一个函数A
依赖于三个函数的场景 - P
,Q
和R
。 P, Q, R
本身已经过单元测试,因为它们进行了一些非常复杂的计算。现在我需要测试函数A
,我有两个选项 -
P, Q, R
function A (params) {
... P()
... Q()
... R()
}
PROs:除了参数外,不需要任何模拟。
CONs:不必要地测试P, Q & R
的逻辑。
P, Q, R
作为参数注入A function A (P, Q, R, params) {
... P()
... Q()
... R()
}
PROs: A
在更加受控制的环境中进行测试,其中P, Q, R
作为args传递。
CONs:我们付出了很多努力来保持模拟函数与原始函数一起更新。
我想知道哪种方法更适合这两种方法,如何以更好的方式控制各自的缺点。
注意:A, P, Q, R
都是pure。
答案 0 :(得分:0)
假设您的函数P, Q, R
是尿液,您可以将它们组合起来。
// A drop in implementation of compose
var compose = function () {
var fns = arguments;
return function (result) {
for (var i = fns.length - 1; i > -1; i--) {
result = fns[i].call(this, result);
}
return result;
};
};
var X = compose(R, Q, P);
function A (func, params) {
// Function body...
}
// Curry function A so that our new function B, matches the signature
// of the version of function A in your first example from the original
//question.
var B = A.bind(undefined, X);
// Function B now has the same signature and behavior of function
// A in your first example.
var value = B(args...);
在此代码中调用函数B
将等同于在原始问题的第一个示例中调用函数A
。