为什么ninject会在nunit中获得不同的Db实例?

时间:2017-06-07 08:31:45

标签: c# asp.net-mvc nunit ninject ninject-extensions

我为基于ASP.NET MVC的应用程序编写集成测试,并尝试解决ninject注册问题。

因此,对于我的ASP.NET MVC注册,我有

 kernel.Bind(typeof(ICustomDbContext), typeof(IUnitOfWork))
                .ToMethod(ctx => ctx.Kernel.Get<CustomDbContext>())
                .InRequestScope();

澄清CustomDbContext实现IUnitOfWork和ICustomDbContext 通过该注册,我保证每个CustomDbContext请求都有一个唯一的实例。该注册在ASP.NET范围内正常工作。

问题是当我编写集成测试时。

[SetUp]
public void SetUp()
{
    kernel = NinjectConfig.CreateKernel();
}


[Test]
public async Task Test()
{
    // Arrange
    var claaService = kernel.Get<IService>();

}

在设置步骤中,我加载我的组合根(在ASP.NET MVC项目中)。


问题是当我得到IService时(IService.cs的实现是Service.cs,该服务依赖于IUnitOfWork.cs和IGenericRepository.cs。IGenericRepository.cs依赖于ICustomDbContext)。
最后,当我访问IService时,我应该有相同的CustomDbContext实例(正如我在MVC的范围内所说)。 我试图在子范围内解决它,但结果是一样的(它们仍然有不同的哈希码):

using (var childKernel1 = new ChildKernel(kernel))
{
    childKernel1.Rebind(typeof(ICustomDbContext), typeof(IUnitOfWork))
    .ToMethod(ctx => ctx.Kernel.Get<CustomDbContext>())
    .InThreadScope();

    var claaService = childKernel1.Get<IClassService>();

}

我的问题是:

  • 为什么会这样?
  • 我如何解决它(如果我不使用ninject,它可以工作,但是我想找到一种使用Ninject的方法,即使我必须在集成测试中添加其他配置)?

1 个答案:

答案 0 :(得分:1)

  

为什么会这样?

Ninject的范围仅限于容器的使用寿命。您已为每个[Test] 设置了要创建的容器,因为您使用的是[SetUp]

  

此属性在TestFixture内部使用,以提供在调用每个测试方法之前执行的一组通用函数。

[SetUp]
public void SetUp()
{
    kernel = NinjectConfig.CreateKernel();
}

如果你想在同一个[TestFixture]中的多个测试中使用相同的容器(假设这是因为你说&#34;实例不一样&#34;,但你没有提到相同的如何),你需要使用[OneTimeSetup]代替。

  

此属性用于识别在执行任何测试之前调用的方法。

[OneTimeSetUp]
public void OneTimeSetUp()
{
    kernel = NinjectConfig.CreateKernel();
}

这当然假设您所有相关的集成测试都在一个类中。

简而言之,您的Ninject容器正在每次测试时重新初始化,这意味着它管理的所有实例也正在重新初始化。