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

发布于 2024-12-17 18:09:11 字数 889 浏览 0 评论 0 原文

我有一个像这样的存储库:

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 并使用带有一个参数的构造函数。

I have a repository like:

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

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

   ...

In Global.asax I have setup the ninject as:

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

This is working fine in the app probably because I'm explicity instantiating by calling the constructor with a paramater. There are problems in the unit tests however.

Then in a unit test I have:

var mockUnitOfWork = new Mock<UnitOfWork>();

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

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

On this last line I get the error:

Can not instantiate proxy of class: MyNamespace.Repository Could not find a parameterless constructor.

I'm confused by this because I thought the point of Ninject was I didn't need to specify a parameterless constructor. Shouldn't ninject have instantiated a Context and used the constructor with one parameter.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只为一人 2024-12-24 18:09:11

当您执行 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 still new.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文