2016-12-08 3 views
1

Ich arbeite an einigen Repo. Und füge Refactoring hinzu, um einige Funktionen in KlasseNode.js + Testen: DI vs harte Abhängigkeiten

zu extrahieren. Die Frage ist - ich bevorzuge die Verwendung von abhängigen Abhängigkeiten von außerhalb (DI). Aber ich sehe, dass es kein übliches Muster für die Anwendung node.js ist.

Also die Frage - gibt es irgendwelche guten Beispiele (Links zu Repos), wo Jungs DI für die Bereitstellung von Abhängigkeiten verwenden.

Die entgegengesetzte Meinung ist - "Wir haben immer proxyquire Modul Mock Abhängigkeiten verwenden können"

PS Beispiel für Code, den ich vorschlage, ist

// use 
const inst = new Cls(getDep1(), getDep2()); 
// where getDep1/getDep2 provide dependencies from side modules 

statt

//Cls 
const dep1 = require('dep1'); 
const dep2 = require('dep2'); 
module.exports = function Cls() { 
    // deps usage 
} 

// and 
const inst = new Cls(); 

Die Frage ist über Argumente in node.js ähnliche Projekte

Antwort

0

Ihr Beispiel ist so klar wie es geht. Wenn Sie einen Stub/Mock in einem Test für eine Klassenabhängigkeit konfigurieren möchten, ohne proxyquire oder spotary oder einen anderen erforderlichen patcher zu verwenden, müssen Sie einen anderen Einstiegspunkt in Ihren Code eingeben.

Sie explizit DI wie in Ihrem Beispiel verwenden:

function Cls(dep1, dep2) { 
    this.dep1 = dep1; 
    this.dep2 = dep2; 
} 

, die von sich selbst leben könnte, dann würde Ihre Berufung Code für den Import Ihrer Klasse verantwortlich sein, seine Abhängigkeiten konfigurieren und es korrekt instanziieren. Auf diese Weise ist Ihr Cls isoliert und selbst testbar.

Sie könnten auch die Abhängigkeiten machen, die als öffentliche Eigenschaften behandelt werden müssen:

const dep1 = require('dep1'); 
const dep2 = require('dep2'); 
module.exports = function Cls() { 
    this.dep1 = dep1; 
    this.dep2 = dep2; 
} 

, dass das Modul erlauben könnte, die Cls in ebenfalls definiert ist, um den Code zu enthalten, der es mit seiner deps zuordnet, während nach wie vor Ermöglichen, dass Ihre Komponententests Cls mit Mock-/Stub-Objekten konfigurieren können. Dies setzt voraus, dass es frei von Nebenwirkungen ist :(

var cls = new Cls(); 
cls.dep1 = new SomeStub(); 
cls.dep2 = new SomeStub(); 
cls.exercise();