如何在单元测试中实例化使用 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>();
这在应用程序中运行良好,可能是因为我通过使用参数调用构造函数来显式实例化。然而,单元测试存在问题。
然后在单元测试中我有:
var mockUnitOfWork = new Mock<UnitOfWork>();
var mockProjectApprovalRepository = new Mock<Repository<ProjectApproval>>();
mockUnitOfWork.Setup(x => x.ProjectApprovalRepository).Returns(mockProjectApprovalRepository.Object);
在最后一行我收到错误:
无法实例化类的代理:MyNamespace.Repository 找不到无参数构造函数。
我对此感到困惑,因为我认为 Ninject 的重点是我不需要指定无参数构造函数。 ninject 不应该实例化一个 Context 并使用带有一个参数的构造函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当您执行
new Mock>()
时,您是在要求 Moq 构造该对象。如果你要求 Ninject 构建它,它就会完成。Ninject 不会神奇地介入任何构建发生的地方 -
new
仍然是new
。在这种情况下,您可以使用
Mock
构造函数的重载,在其中指定额外的参数。请注意,人们普遍认为 Ninject 不应该与任何与术语“单元测试”的任何常见定义相近的任何地方。
When you do
new Mock<Repository<ProjectApproval>>()
, you're asking Moq to construct the object. If you asked Ninject to construct it, it would do it.Ninject doesn't magically step in wherever construction happens -
new
is stillnew
.In this case, you can use an overload of the
Mock
constructor wherein you specify extra args.Note that its generally accepted that Ninject shouldnt be anywhere near anything remotely close to the any common definition of the term Unit Test.