[英]Unit testing functions - passing dependencies as args vs global access
考虑一个函数A
依赖于三个函数P
, Q
和R
。 P, Q, R
本身已经进行了单元测试,因为它们执行了一些非常复杂的计算。 现在我需要测试功能A
,我有两个选择-
P, Q, R
function A (params) {
... P()
... Q()
... R()
}
优点:除了参数外,无需嘲笑。
缺点:不必要地测试P, Q & R
的逻辑。
P, Q, R
作为参数注入A function A (P, Q, R, params) {
... P()
... Q()
... R()
}
优点: A
在更可控的环境中进行了测试,因为P, Q, R
作为args传递。
缺点:为了使模拟函数保持其原始函数的最新状态,我们付出了很多努力。
我想知道哪种方法更好,以及如何更好地控制它们各自的弊端。
注意: A, P, Q, R
都是纯净的 。
假设您的函数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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.