Row*_*man 5 testing asp.net-mvc-4 entity-framework-5
几个星期以来,我一直在研究这个话题.我发现了很多材料,但我觉得完全无法回答这个问题.许多信息已有多年,可能不适用.
我正在构建一个MVC4应用程序,它是对现有但过时的应用程序的重建.数据库已经存在(因此数据库优先方法)很大且很复杂.理想情况下我想要的是一个虚假的"实体"对象,它与我的主要实体对象相同,但使用了某种不同的"模拟"或内存数据库,这样我就可以生成一堆虚假数据,运行测试和收到反馈.例如:
FakeEntities _db = new FakeEntities();
// test a controller action
Run Code Online (Sandbox Code Playgroud)
据我所知,到目前为止我应该使用集成测试.根据Ladislav Mrnka的这篇文章,集成测试意味着测试控制器操作,意味着LINQ-to-entities和LINQ-to-objects的问题更少
如果您模拟存储库,您将使用Linq-To-Objects,您将进行绿色测试,但如果您使用Linq-To-Entities运行应用程序,您将获得一个例外
我知道他的意思,我可以同意 - 我想确保我总是使用Linq-To-Entities和一个真实的(或接近真实的)数据库.
我已经阅读了很多关于存储库模式的内容,而linush的这个博客看起来非常接近我的尝试.事实上,我已经创建了一个虚拟项目,我在其中测试了创建通用存储库并成功使用了Entity Framework和依赖于内存中ObjectSet的"模拟"DbContext.
我对这种方法的问题是
你的问题本身就充满了矛盾。例如,您说测试存储过程很重要,但您也希望与数据库无关。哪一个?
如果您确实想要与数据库无关,请摆脱存储过程并使您的测试环境变得更加简单。您将能够使用完全内存数据库(如 Apache Derby)作为测试环境的一部分。这使得在 Jenkins 或任何 CI 环境中编写脚本变得更加容易。
接下来您需要决定要测试什么。如果您要在控制器周围进行单元测试,请确保将控制器编写为可测试的。由于您是从头开始,因此这应该很容易做到。使用注入等概念可以轻松地将部分功能替换为模拟实现。使用模拟对象框架(正如您所发现的)创建一组传递给正在测试的控制器的对象。
如果您可以自己测试您的控制器,那么以上所有内容都很好。但是,如果您正在构建一个高度相互依赖的堆栈,其中数据库存储过程与控制器和视图进行深入交互,那么这将无法很好地工作。要么重新设计你的方法,以便可以进行单元测试,要么转向功能测试。
Selenium是最知名和最常用的 Web 应用程序功能测试环境之一。您可以从头到尾测试整个系统。更好的是,您可以开始围绕现有的旧应用程序编写 Selenium 测试,然后确保新的实现在重写期间重现相同的功能。
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |