2016-12-08 4 views
1

私はいくつかのレポに取り組んでいます。そして、リファクタリングを追加して、クラスにいくつかの機能を抽出してください。Node.js + testing:DI対ハード依存性

質問は - 外部(DI)から渡す依存関係を使用することをお勧めします。しかし、node.jsアプリケーションでは一般的なパターンではないことがわかります。

だから質問には、従業員が依存関係を提供するためにDIを使用する良い例があります(reposへのリンク)。

反対意見がある -

PS私が提案するコードの 例は

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

代わりの

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

// and 
const inst = new Cls(); 

ですが "私たちは常にモックの依存関係にproxyquireモジュールを使用することができます"質問はnode.js関連プロジェクトの引数についてです

答えて

0

あなたの例は、それが得られるほど明確です。もしあなたがproxyquireやmockeryあるいはその他の必要なpatcherを使わずにクラスの依存関係をテストするためにstub/mockを設定したいのであれば、コードに別のポイントを与える必要があります。あなたが明示的にあなたの例のようにDIを使用することができ

:自体ではオフに住むことができる

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

を、そしてあなたの呼び出し元のコードは、あなたのクラスをインポートし、その依存関係を設定し、それを正しくインスタンス化するための責任を負うことになります。そうすれば、あなたのClsは分離され、単体テストが可能になります。

あなたはまた、パブリックプロパティとして処理する必要がある依存関係を公開することができます:まだながら、

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

ClsもそのDEPSに関連付けるコードを含むように定義されているモジュールを可能性がありますあなたの単体テストを模擬/スタブオブジェクトで容易にClsに設定することができます。これは、副作用がないことを要求しています。(

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