2016-06-26 3 views
0

Aの関数がP,QRの3つの関数に依存するシナリオを考えてみましょう。 P, Q, Rは、実際には複雑な計算を行うため、ユニットテストされています。今、私は機能Aをテストする必要があると私は2つの選択肢がある - ユニットテスト関数 - argsとグローバルアクセスのように依存関係を渡す

function A (params) { 
    ... P() 
    ... Q() 
    ... R() 
} 

PROのから直接

アクセスP, Q, Rのparamsを除き不要モックを。
CONs:P, Q & Rのロジックを不必要にテストします。

function A (P, Q, R, params) { 
    ... P() 
    ... Q() 
    ... R() 
} 

PROのに引数として

を注入P, Q, RAは、引数として渡されたようP, Q, Rとして、より制御された環境でテストされています。
CONs:モックされた関数を元の関数で最新の状態に更新するために多くの努力が払われています。

どのアプローチが2つの方が優れているか、どのようにしてより良い方法でそれぞれの問題をコントロールできるかを知りたいと思います。

注:A, P, Q, Rはすべてpureです。

+0

多分この[同様のq&a](http://stackoverflow.com/questions/35861372/how-to-test-a-tree-of-pure-function-calls-in-isolation)はあなたに役立ちます – ftor

答えて

0

機能P, Q, Rが尿であると仮定すると、それらを合成することができます。このコード内の関数を呼び出すB

// 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...); 

は、元の質問最初の例では機能Aを呼び出すのと同じになります。

関連する問題