5

问题)

  • 如何使用 EntityFramework 5 测试我的 ASP.NET MVC4 Web 应用程序?
  • 我应该使用像 Moq 这样的模拟框架吗?

介绍

我已经研究这个话题好几个星期了。我找到了很多材料,但我觉得没有什么可以完全回答这个问题。许多信息已有多年历史,可能不适用。

我的情况

我正在构建一个 MVC4 应用程序,它是对现有但过时的应用程序的重建。数据库已经存在(因此是数据库优先的方法),庞大且复杂。理想情况下,我想要的是一个假的“实体”对象,它与我的主要实体对象相同,但使用不同的“模拟”或某种内存数据库,这样我就可以生成一堆假数据,运行测试和收到反馈。例如:

FakeEntities _db = new FakeEntities();
// test a controller action

至今...

据我所知,我应该使用集成测试。根据Ladislav Mrnka 的这篇文章,集成测试意味着测试控制器操作,并意味着 LINQ-to-entities 和 LINQ-to-objects 的问题更少

如果您模拟存储库,您将使用 Linq-To-Objects 并且您将获得绿色测试,但如果您使用 Linq-To-Entities 运行应用程序,您将收到异常

我知道他的意思,我可以同意 - 我想确保我始终使用 Linq-To-Entities 和真实(或接近真实)的数据库。

我已经阅读了很多关于存储库模式的内容,而linush 的这个博客看起来与我可能正在尝试的内容非常接近。事实上,我已经创建了一个虚拟项目,在该项目中我测试了创建通用存储库并成功使用了实体框架和依赖于内存中 ObjectSet 的“模拟”DbContext。

我对这种方法的问题是

  1. 如上所述,这意味着我使用的是 Linq-To-Objects 而不是 Linq-To-Entities
  2. 我的网络应用程序将依赖大量使用存储过程

回答前总结

  • MVC4、EF5 和 SQL Server(尽管我想保持与数据库无关)
  • 能够测试使用 SQL 存储过程的逻辑
  • Linq 到实体
  • 数据库优先的方法
4

2 回答 2

1

我写了两篇关于如何使用LINQUnit Of WorkRepository PatternEntity Framework 的文章。测试/模拟的好方法。看看他们。

http://gaui.is/how-to-mock-the-datacontext-entity-framework/

http://gaui.is/how-to-mock-the-datacontext-linq/

于 2013-07-27T22:09:28.450 回答
1

你的问题本身就充满了矛盾。例如,您说测试存储过程很重要,但您也希望与数据库无关。哪一个?

如果您真的想成为数据库不可知论者,请摆脱您的存储过程并使您的测试环境更加简单。您将能够使用完全内存数据库(如 Apache Derby)作为测试环境的一部分。这使得在 Jenkins 或任何你的 CI 环境中编写脚本变得更容易。

接下来,您需要决定要测试的内容。如果您在控制器周围包装单元测试,那么请确保您编写的控制器是可测试的。由于您是从头开始,这应该很容易做到。使用注入等概念可以轻松地将部分功能交换为模拟实现。使用模拟对象框架(如您所见)创建一组传递给正在测试的控制器的对象。

如果您可以自己测试控制器,以上所有内容都很好。但是,如果您正在构建一个高度相互依赖的堆栈,其中数据库存储过程与控制器和视图进行深度交互,那么这将无法正常工作。要么重新设计您的方法,以便可以进行单元测试,要么转向功能测试。

Selenium是 Web 应用程序最著名和使用最广泛的功能测试环境之一。您可以端到端地测试整个系统。更好的是,您可以开始围绕现有的旧应用程序编写 Selenium 测试,然后确保新实现在重写期间重现相同的功能。

于 2013-07-28T01:21:02.273 回答