单元测试功能 - 将依赖关系传递为args与全局访问

时间:2016-06-26 09:10:10

标签: javascript unit-testing functional-programming mocking

考虑一个函数A依赖于三个函数的场景 - PQRP, Q, R本身已经过单元测试,因为它们进行了一些非常复杂的计算。现在我需要测试函数A,我有两个选项 -

直接从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

1 个答案:

答案 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