使用Ninject实例进行单元测试

时间:2013-01-08 18:48:22

标签: c# asp.net-mvc unit-testing ninject

我正在尝试使用ninject和visual studio 2012的单元测试项目测试我的服务。我的注入在我的控制器上运行正常,但是当我尝试在单元测试类中执行相同操作时,我得到{{1 }}

Exception

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

我认为注射有问题,但我不明白。

3 个答案:

答案 0 :(得分:11)

在我看来,错误 _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);
    }
}

答案 1 :(得分:3)

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

额外提示:

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

答案 2 :(得分:3)

依赖注入能够调用构造函数并使用具有值的参数填充它的唯一方法是依赖注入内核是实例化类的内核。

在您的情况下,MSTest正在实例化您的测试类,因此Ninject没有机会调用您的构造函数。

老实说,你这是错误的做法。如果你进一步尝试让Ninject(或任何其他DI框架)实例化你的测试类,你将与MSTest作战。

我建议你使用'new'来实例化测试中的类(_giftService = new GiftService();)。如果该类在其构造函数中具有依赖项,请使用模拟框架来传递这些依赖项的模拟版本。这样,您可以将单元测试与仅测试类的功能隔离开来。