繁体   English   中英

单元测试功能-将依赖项作为args与全局访问进行传递

[英]Unit testing functions - passing dependencies as args vs global access

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM