9

我正在尝试使用 ninject 和 Visual Studio 2012 的单元测试项目来测试我的服务。我的注入在我的控制器上工作正常,但是当我尝试在单元测试类中做同样的事情时,我得到一个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

_giftnull。你的变量是_giftService. 您还应该[TestInitialize]为您的构造函数使用该属性。

额外提示:

您不应该在单元测试中创建任何依赖项。因此giftService,您要使用的应该是模拟或存根。

于 2013-01-08T18:52:23.890 回答