如何在单元测试中实例化使用ninject的存储库

时间:2011-11-22 08:53:10

标签: asp.net-mvc unit-testing repository ninject

我有一个类似的存储库:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
   private readonly IContext _db;

   public Repository(IContext context)
   {
      _db =context;
   }

   ...

在Global.asax中,我将ninject设置为:

kernel.Bind<IContext>().To<Context>();

这在app中运行正常可能是因为我通过使用paramater调用构造函数来明确实例化。但是,单元测试存在问题。

然后在单元测试中我有:

var mockUnitOfWork = new Mock<UnitOfWork>();

var mockProjectApprovalRepository = new Mock<Repository<ProjectApproval>>();

mockUnitOfWork.Setup(x => x.ProjectApprovalRepository).Returns(mockProjectApprovalRepository.Object);

在最后一行我收到错误:

无法实例化类的代理:MyNamespace.Repository无法找到无参数构造函数。

我对此感到困惑,因为我认为Ninject的观点是我不需要指定无参数构造函数。 ninject不应该实例化Context并使用带有一个参数的构造函数。

1 个答案:

答案 0 :(得分:2)

执行new Mock<Repository<ProjectApproval>>()时,您要求Moq构建对象。如果您要求Ninject构建它,它就会这样做。

Ninject不会神奇地介入施工的任何地方 - new仍为new

在这种情况下,您可以使用Mock构造函数的重载,其中指定了额外的参数。

请注意,它普遍认为Ninject不应该接近任何与单元测试一词的任何通用定义相近的任何地方。