2016-06-26 4 views
0

Stellen Sie sich ein Szenario vor, bei dem eine Funktion A von drei Funktionen abhängt: P, Q und R. P, Q, R selbst wurden Unit-getestet, da sie einige wirklich komplexe Berechnungen durchführen. Jetzt muss ich die Funktion A testen, und ich habe zwei Optionen -Komponententestfunktionen - Übergabe von Abhängigkeiten als Argumente gegenüber dem globalen Zugriff

Zugang P, Q, R direkt von einem

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

PROs: Kein spöttischen erforderlich, außer für params.
CONs: Unnötige Prüfung der Logik von P, Q & R.

Injekt P, Q, R als Argumente in A

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

Vorteile:A wird in einer kontrollierten Umgebung, wie P, Q, R wie args als bestanden getestet.
CONs: Es wird viel Aufwand betrieben, um die verspotteten Funktionen mit ihren ursprünglichen Funktionen zu aktualisieren.

Ich möchte wissen, welcher Ansatz besser ist und wie ich ihre jeweiligen Nachteile besser kontrollieren kann.

HINWEIS: A, P, Q, R sind alle pure.

+0

Vielleicht hilft Ihnen dies [ähnliche q & a] (http://stackoverflow.com/questions/35861372/how-to-test-a-tree-of-pure-function-calls-in-isolation) – ftor

Antwort

0

Angenommen, Ihre Funktionen P, Q, R sind urinär, können Sie sie komponieren.

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

Funktion aufrufen B in diesem Code wird an den Aufruf des Funktions A in den ursprünglichen Fragen erstes Beispiel entsprechen.

Verwandte Themen