[英]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.