如何在不模仿但使用数据库的情况下对项目进行单元测试?

时间:2012-09-06 06:06:15

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

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

3 个答案:

答案 0 :(得分:3)

单元测试倾向于不使用外部资源作为数据库或连接到远程服务器。这就是嘲笑的原因。

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

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

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

两种方法都假定数据库架构不会更改。如果数据库模式发生了变化 - 无论如何都会涉及到一些工作。

答案 1 :(得分:1)

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

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

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

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

  3. 运行测试

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

  5. 这可确保数据始终与测试保持一致,并且还会强制您使数据库脚本保持最新状态。

答案 2 :(得分:0)

看不出这个问题的重点,

1)那就是您正在谈论的集成测试,而不是单元测试。

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

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

4)我认为MVC附带了IDependencyResolver,那么对它进行搜索吗?

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

干杯