繁体   English   中英

如何在不使用存储库模式的情况下对 ASP.NET MVC Controller 进行单元测试

[英]How to unit test ASP.NET MVC Controller without Using Repository Pattern

我只是想知道是否有一种方法可以在不使用存储库模式的情况下在 MVC 中对我的一些 controller 操作进行单元测试。 我开发了一个 ASP.NET MVC 站点,但在初始阶段没有进行单元测试。 现在我想用我的 controller 中的两个或更多动作向我的导师演示一些单元测试。我的大部分动作逻辑从数据库获取数据,一个 controller 从不同的表中获取数据,即一个 controller 中的动作从不同的表中读取。 我认为可以使用通用存储库模式进行测试。 作为初学者,我发现我只能对不是来自数据库的代码进行单元测试,但不幸的是,我的 controller Actions 中的大部分代码都来自数据库。 我在我的数据库中使用 Visual Studio 中的默认测试工具和 EF 代码优先方法。
例如,我只想对以下操作进行单元测试,而不必对同一 controller 中的其他操作进行单元测试。

public ActionResult Index()
    {
        var model = _db.PhotoGallery;
        return View(model);
    }

这仅用于演示目的。

根据定义,单元测试应该只影响它调用的方法。 如果你能找到一种方法来模拟你的 _db object 这样你实际上不会导致数据库往返,那么你可以对依赖它的这个方法进行单元测试。 否则,不。

您的_db字段类型是接口吗? 它是通过注射提供的吗? 如果是这样,您很可能可以对该方法进行单元测试。

如果不删除 controller 方法中对数据库的直接依赖,您将无法对这些方法进行单元测试。

这样做的总体推荐方法是将 IOC 容器(例如Ninject )与 MVC 结合使用,使您可以将所需的数据传递给 controller 的构造函数。该“数据对象”不得绑定到数据库,通常它只是一个 POCO object 或作为接口传递。

在您的单元测试中,您可以使用专为您的单元测试构造的内存数据 object 替换这些依赖项,通常使用 mocking 框架(例如 Rhino Mocks 或Moq )“模拟”。

使用这种方法,您不仅可以使您的控制器可以进行单元测试,而且最终会得到非常松散耦合的代码,这种好处可能会在以后的开发中得到回报。

这就是所谓的testable代码:) 当您执行单元测试时,您需要确定,测试失败的唯一原因是在 SUT(被测系统,或 class 正在测试)实现中发生变化。 当然,当依赖 API 发生变化时它可能会被破坏(没关系,你应该修改 SUT 以使用新的 API),但如果依赖实现发生变化它永远不会失败。 这就是为什么使用 mocking 和存根。

但是如果你想模拟依赖,你不应该在 SUT 中创建它。 它应该被注入到 SUT(构造函数,参数注入的属性)。

所以,回到你的情况:

  • 如果你想拥有可测试的 class,你必须注入依赖(db)
  • 依赖应该被嘲笑
  • 您没有被迫使用存储库模式。 如果你可以模拟你的数据库 class,就模拟它。 或者使用任何其他数据访问抽象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM