【问题标题】:How to unit test a project without mocking but by using database?如何在不模拟但使用数据库的情况下对项目进行单元测试?
【发布时间】:2012-09-06 06:06:14
【问题描述】:

我们使用 razor view、c#、MVC3、.net 4.0 开发了一个应用程序。我们想在没有模拟的情况下对控制器进行单元测试。我们的要求是:需要调用并执行Repository方法,并使用数据库进行测试。请提供一些解决方案。

【问题讨论】:

  • 此类测试通常不称为“单元测试”,而是评估者集成测试。您需要将生成的测试称为“单元测试”是否有特殊原因?
  • 我没有手头的例子,但是你可以将你的测试方法包装在一个事务中,然后在测试结束之前回滚事务。

标签: c# database asp.net-mvc-3 unit-testing mocking


【解决方案1】:

单元测试往往不使用数据库或远程服务器连接等外部资源。这就是为什么要使用模拟。

我相信有时让测试访问这些资源可能会很有用。 (但我们称它们为...验收测试?或集成测试 - 只是为了区分这些和经典单元测试)。

看看MBUnit 测试框架(非常类似于 nUnit),它可以让你很容易地完成它,它允许自动回滚对数据库的所有更改(所以你不会结束每次您想运行测试时都将您的数据库恢复到“干净”状态)。看看这篇详细描述它的博客文章:http://blog.benhall.me.uk/2008/01/mbunit-24-rollback-rollback2-and.html

其他方法是拥有一个特殊的数据库并生成数据 - 即每次运行一组测试时生成新的用户 ID 名称等。请注意,在这种方法中,可能会不时需要清理数据库(在某些值上发生冲突,例如名称,也可能无法使用已经填充了一些数据的 db 来测试某些场景)。

这两种方法都假设 db 架构不会改变。如果 db 架构发生变化 - 无论如何都会涉及一些工作。

【讨论】:

    【解决方案2】:

    您的方法称为集成测试,而不是单元测试。

    这取决于每个应用程序,但我用于集成测试的方法是:

    1. 使用脚本删除/创建新的测试数据库和架构(在每次测试运行之前发生)

    2. 运行一些脚本,将正确的数据放入数据库中以进行特定测试

    3. 运行测试

    4. 删除测试数据库(在每次测试运行后发生)

    这可确保数据始终与测试保持一致,并强制您将数据库脚本保持在最新状态。

    【讨论】:

      【解决方案3】:

      看不到这个问题的重点,

      1) 你说的是集成测试,不是单元测试。

      2) 运行“Visual Studio 单元测试框架”时,您始终可以编写一个 TestMethod 来使用实际的存储库而不是 mocking 东西,mocking 只是用 mock 替换存储库,您始终可以使用真实的存储库。您只需要在测试项目应用程序配置本身等中配置您的数据库连接字符串...实际上取决于它的架构方式。

      3) 我注意到你没有提到任何关于 IOC/DI 的内容,所以我假设你没有使用任何内容,因此这个问题。使用 IOC/DI,您始终可以替换您在测试时使用的实际实例,无论是模拟的还是真实的,并从单个入口/代码点轻松替换您的对象。真的,您的测试项目可以设置您需要的所有依赖项。

      4) 我认为 MVC 带有 IDependencyResolver,所以有搜索吗?

      5) IOC 容器只是让测试更容易,这是我的两分钱,否则手动方式。

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多