2013-01-08 6 views
7

私は、ninjectとVisual Studio 2012のユニットテストプロジェクトを使ってサービスをテストしようとしています。私のインジェクションはコントローラでうまくいきますが、ユニットテストクラスIで同じことをしようとするとExceptionを入手してください。ユニットテストNinjectインスタンシエート

System.NullReferenceException: Object reference not set to an instance of an object.

namespace Trex.UnitTests 
{ 
    [TestClass] 
    public class GiftServiceTests 
    { 
     private IGiftService _giftService; 

     public void GiftServiceTest(IGiftService giftService) 
     { 
      _giftService = giftService; 
     } 

     [TestMethod] 
     public void AddGift() 
     { 

      var list = _gift.FindAll(); <--- this line throw an exception 
     } 
    } 
} 

私は、注射に何か問題があると思いますが、私はそれを得るいけません。

答えて

9

のタイプが_giftServiceのように見えます。さらに、コンストラクタで属性[TestInitialize]を使用する必要があります。

は、正しいサービス名_giftServiceを置くことによって、次のコードを試してみてください - あなたのコードではなく、注入されていること:

var list = __giftService.FindAll(); 

編集:ユニットテストはNinjectずに行うべきです。テスト対象オブジェクトのインスタンスを作成し、すべての依存関係のモックを手動で注入するだけです。ここで

[TestInitialize]サンプルです:

ユニットテストは、デフォルトコンストラクタ持っている必要があります:依存性の注入は、あなたのコンストラクタを呼び出すとでそれを埋めることが可能である

[TestClass] 
public class TestControllersHomeController 
{ 
    private HomeController _sut; 

    [TestInitialize] 
    public void MyTestInitialize() 
    { 
     var kernel = NinjectWebCommon.CreatePublicKernel(); 
     _sut = kernel.Resolve<HomeController>(); 
    } 

    [TestMethod] 
    public void TestIndex() 
    { 
     var result = _sut.Index(); 
     Assert.IsNotNull(result); 
    } 
} 
3

_giftは、nullである。あなたの変数は_giftServiceです。コンストラクタには[TestInitialize]属性も使用する必要があります。

エクストラヒント:

あなたは、あなたのユニットテストで任意の依存関係を作成しないでください。したがって、使用したいgiftServiceはモックまたはスタブでなければなりません。

3

唯一の方法依存性注入カーネルがあなたのクラスをインスタンス化するものであるかどうかの値を持つパラメータです。

あなたのケースでは、MSTestがテストクラスをインスタンス化しているので、Ninjectはコンストラクタを呼び出す機会がありません。

正直言って、あなたは間違った方向に向かっています。これをさらに追求して、Ninject(または他のDIフレームワーク)があなたのテストクラスをインスタンス化しようとするならば、あなたはMSTestと戦います。

テスト中のクラス(_giftService = new GiftService();)をインスタンス化するには、「新規」を使用することをお勧めします。そのクラスがそのコンストラクタに依存関係を持っている場合は、mockingフレームワークを使用してそれらの依存関係の模擬バージョンを渡します。このようにして、単体テストをテスト対象のクラスの機能だけに分離します。

関連する問題