我们使用razor view,c#,MVC3,.net 4.0开发了一个应用程序。我们想在没有嘲笑的情况下对控制器进行单元测试。我们的要求是:需要调用和执行Repository方法,并将数据库用于测试。请提供一些解决方案。
答案 0 :(得分:3)
单元测试倾向于不使用外部资源作为数据库或连接到远程服务器。这就是嘲笑的原因。
我认为有时候让测试访问这些资源可能会有用。 (但让我们称之为......验收测试?或集成测试 - 只是为了区分这些测试和经典单元测试)。
看一下MBUnit测试框架(非常类似于nUnit),它允许你很容易地完成它,它允许自动回滚数据库的所有更改(所以你不会每次要运行测试时,最终都会将数据库恢复到“干净”状态。请查看详细描述它的博文:http://blog.benhall.me.uk/2008/01/mbunit-24-rollback-rollback2-and.html
其他方法是拥有一个特殊的数据库并生成数据 - 即每次运行一堆测试时生成新的用户ID名称等。请注意,在这种方法中,可能会发生数据库需要不时清理(某些值如名称的冲突,也可能无法使用已填充某些数据的db测试某些方案)。 / p>
两种方法都假定数据库架构不会更改。如果数据库模式发生了变化 - 无论如何都会涉及到一些工作。
答案 1 :(得分:1)
您的方法称为集成测试,而不是单元测试。
这取决于每个应用程序,但我采用的集成测试方法是:
使用脚本删除/创建新的测试数据库和模式(在每次测试运行之前发生)
运行一些脚本,将正确的数据放入数据库以进行特定测试
运行测试
删除测试数据库(在每次测试运行后发生)
这可确保数据始终与测试保持一致,并且还会强制您使数据库脚本保持最新状态。
答案 2 :(得分:0)
看不出这个问题的重点,
1)那就是您正在谈论的集成测试,而不是单元测试。
2)运行“Visual Studio单元测试框架”时,您总是可以编写一个TestMethod来使用实际的存储库而不是模拟东西,模拟只需用模拟替换存储库,您可以随时使用真实存储库。您只需要在测试项目app config本身等中配置数据库连接字符串......实际上取决于它的架构方式。
3)我注意到你没有提到关于IOC / DI的任何内容,所以我假设你没有使用任何内容,因此这个问题。使用IOC / DI,您可以随时替换您在测试时使用的实际实例(模拟或实际),并轻松地从单个条目/代码点替换您的对象。实际上,您的测试项目可以设置您需要的所有依赖项。4)我认为MVC附带了IDependencyResolver,那么对它进行搜索吗?
5)IOC容器只是让测试变得更容易,是我的两分钱,否则就是手动方式。
干杯