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