9

ninjectを使用してサービスをテストし、Visual Studio 2012で単体テストプロジェクトを実行しようとしています。コントローラーでinjectは正常に機能しますが、単体テストクラスで同じことを実行しようとするとException

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
        }
    }
}

注射に何か問題があると思いますが、わかりません。

4

3 に答える 3

13

のタイプミスの ように私には見えます_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);
    }
}
于 2013-01-08T18:53:02.980 に答える
4

依存性注入がコンストラクターを呼び出して値を持つパラメーターで埋めることができる唯一の方法は、依存性注入カーネルがクラスをインスタンス化するカーネルであるかどうかです。

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

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

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

于 2013-01-08T19:08:46.867 に答える
3

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

追加のヒント:

単体テストで依存関係を作成しないでください。したがって、giftService使用するのはモックまたはスタブである必要があります。

于 2013-01-08T18:52:23.890 に答える