我有一个类似的存储库:
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并使用带有一个参数的构造函数。
答案 0 :(得分:2)
执行new Mock<Repository<ProjectApproval>>()
时,您要求Moq构建对象。如果您要求Ninject构建它,它就会这样做。
Ninject不会神奇地介入施工的任何地方 - new
仍为new
。
在这种情况下,您可以使用Mock
构造函数的重载,其中指定了额外的参数。
请注意,它普遍认为Ninject不应该接近任何与单元测试一词的任何通用定义相近的任何地方。