我为基于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>();
}
我的问题是:
答案 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容器正在每次测试时重新初始化,这意味着它管理的所有实例也正在重新初始化。