簡體   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