2016-05-21 22 views
0

ビルドしたモジュールをユニットテストしたい。Node.js他の関数を呼び出す関数をユニットテストする方法

function MyModule(...) { 
    var self = this; 
    MyModule.init.call(self, ...); 
} 

util.inherits(MyModule, MySuperModule); 

MyModule.init = function(...) { 
... 
}; 

MyModule.prototype.logic = function(..., done) { 
    calls fnA, fnB, fnC, fnD conditionally 
    done(...) 
}; 

MyModule.prototype.fnA = function(...) { 
... 
}; 

MyModule.prototype.fnB = function(...) { 
... 
}; 

MyModule.prototype.fnC = function(...) { 
... 
}; 

MyModule.prototype.fnD = function(...) { 
... 
}; 

MySuperModule:

function MySuperModule(...) { 
    ... 
    } 

    MySuperModule.prototype,fn = function(..., done) { 
     var self = this; 
     ... 
     self.logic(..., function done(...) { 
      ... 
      done(...) 
     }); 
    } 

今MyModule.logic()ユーザーが明示的に呼び出されることはありません、それが唯一である MyModuleというの...それはかなりどのように見えるかの印象を与えるために MySuperModule.fn()が呼び出されました。 同じことは、委任チェーンを介して渡される特定のパラメータに基づいて条件付きで呼び出される他のすべてのMyModule関数にも適用されます。

私の質問は以下の通りです:

  • 私は別に、すべてのMyModuleという機能をテストしたり、単にMySuperModule.fnを(テストする必要があります)すべての可能なシナリオ
  • をカバーする異なるパラメータで、私は機能をテストする必要があります知っていますMyDuperModule.fn()でdone()コールバックが実行されているため、MySuperModule.fn()を使用してどうすればよいでしょうか? MySuperModule.fn()の引数に指定された引数に依存して、MyModule.logic()done()コールバックが呼び出されたことに依存する引数で呼び出されます。

答えて

1

私の見解では、ユーザーが直接呼び出しているかどうかにかかわらず、個々の関数を確実にテストする必要があります。

ユニットテストの目的は、テストの個々のユニットが期待することを確実にすることです。個々の機能/ユニットが期待どおりに動作することを(相対的に)確信している場合は、相互にうまく機能するという自信があります。

モジュールの性質をコードスニペットから実際に収集するのは難しいので、テストの実装方法を提案するのは難しいです。しかし、それはどのようにあなたの完了/コールバック関数が呼び出されているかどうかを確認する方法と、どのような引数を求めているようです。 そのためにはスタブの使用をお勧めします。私は通常sinonを使用しますが、私は他の同様のツールが利用可能であると確信しています。

また、私はmochaのようなテストランナーの使用を検討する必要があります!

0

プログレッシブテストを行う必要があります。それぞれの機能をテストする必要があります。 ここでどのように進めることができますか?

  1. 親機能のテストケースを作成します。呼び出し中の内部関数をモックする。あなたは模擬用にsinonライブラリを使用することができます。
  2. 2番目の質問では、sinon mockのyield関数を使用して任意のコールバック関数をモックできます。また、そのコールバックからどの出力を指定することもできます。このようにして、さまざまなシナリオで複数のカスタム出力の関数をテストできます。
1

本当にMySuperModuleにMyModuleを注入する方法によって異なります。しかしまず第一に、単体テストではMyModuleとMySuperModuleをMyModuleや他のすべての依存関係からのMockedバージョンで個別にテストする必要があることを指摘します。これはMyModuleを2回テストする必要がないためです。その必要はありません。

スタブを作成するには、Sinon.JSというライブラリがあり、これは本当にうまく動作します。

何らかの理由でMyModuleにスパイを作成したいのであれば、リスナーをMyModule(これはMyModuleメソッドに適用されます)に接続するだけで、指定されたメソッドが呼び出されたかどうか。

var MyModuleMethodASpy = sinon.spy(MyModulem 'MethodA'); 
MySuperModule.someMethod(); 
assert(MyModuleMethodASpy.called) 

ので、このコードは、スパイを作成MyModule.MethodA()が今までに呼び出された場合MySuperModuleや小切手上のいくつかのメソッドをトリガーします。

あなたは同様にあなたが特定のメソッドなどの収益を依存には何があるかを制御したい場合はスタブを作成することができます。

var MyModuleStub = sinon.stub(MyModule, 'MethodA').returns([...somedata]); 
関連する問題