TDD和ADO.NET实体框架

18

最近我一直在使用ADO.NET Entity Framework,发现它非常适合我正在开发的项目需求。同时我也觉得它很酷,因为它不会影响原有程序。

在从现有数据库生成数据模型后,你需要面对将生成的模型和业务逻辑集成的任务。更具体地说,我习惯于使用DAL接口的mocks/stubs来集成测试与数据存储交互的类。问题是,你无法使用ADO.NET Entity Framework来做这件事,因为它生成的实体只是简单的类,没有接口。

问题是:如何在使用ADO.NET Entity Framework开发应用程序时应用TDD方法?这是可行的吗,还是我应该迁移到其他DAL生成工具集?


不,这个答案已经不再有效了。请查看https://dev59.com/S3RC5IYBdhLWcg3wYP6h#23598884。 - Believe2014
6个回答

14

Entity Framework一直受到一个重要批评,即它本质上很难进行测试,例如在gef引用的ALT.Net Vote of No Confidence中。

这篇博客文章讨论了如何解决这个问题,并且在使用Entity Framework时能够在不连接数据库的情况下测试代码。

如果可测试性是一个重要问题,您可能需要考虑使用另一个ORM框架,例如NHibernate,至少在Entity Framework 2.0发布之前。


那篇博客的参考很好,尽管在 EF 2.0 之后这个问题就不存在了,但看起来需要经历很多工作。 - Dave Swersky
我投票反对这个答案,因为现在可以为EF创建单元测试。EF已经发生了很大变化。请参见https://dev59.com/S3RC5IYBdhLWcg3wYP6h#23598884。 - Believe2014

10

虽然原问题已经得到了回答,但我感觉还可以补充一些:

目前我正在构建一个内部网站,使用的是Entity Framework 4.0。通过新增的POCO支持,我能够在业务逻辑和控制器中进行无需数据库连接的测试。

虽然新的t4模板可以生成POCO,但我在VS 2010中找不到生成对象上下文(对象上下文基本上作为EF的内置工作单元,并且对于将EF对象映射到POCO非常重要)的t4模板。幸运的是Joachim Lykke Andersen在他的博客文章《Entity Framework 4.0 Beta 1 – POCO, ObjectSet, Repository and UnitOfWork》中编写了一个生成对象上下文的t4模板,对我很有帮助。如果您想使用可在没有数据库连接的情况下进行测试的EF4解决方案,我强烈推荐实现类似他的解决方案,其中包括通用存储库、工作单元包装器和工作单元工厂。这非常有帮助。

祝你好运。


2
以上链接无法使用,是否有其他参考位置可以获取 t4 模板?如果有,请提供。 - manu
我更新了帖子,以表彰博客作者Joachim Lykke Andersen,并更改了链接到2010年10月30日的Wayback Machine存档。 - Rich Shealer

3
我认为 Entity Framework 的第一个版本设计是失败的,这让我对它没有信心。不过,我要赞扬 EF 产品团队,因为他们承认了失败,并采取开放设计流程来回应社区。下一个版本可能不会完美,甚至可能无法在生产级应用中使用,但我认为他们终于开始理解那些知道糟糕设计是糟糕业务的人所关心的重点。话虽如此……我仍然持怀疑态度。持续的设计时反馈对这些人来说是新的,我已经读到了一些在 ADO.NET 博客上引起警惕的声明。我们将看到随着 .NET 4.0 的发布会发生什么。

他们似乎正在努力:

使用 Entity Framework 4.0 进行测试驱动开发演示


2

"持久化基础设施与实体类的紧密耦合在很大程度上消除了在业务逻辑上使用自动化测试的非常紧密的反馈周期的能力。在当前状态下,EF实体类无法独立于数据库进行有效的单元测试。

行为对象的自动化单元测试的效率在很大程度上取决于测试数据设置机制的简易性和测试的快速执行。使用实际数据库将使测试数据设置更加费力,引入不相关于测试的关系约束数据,并使测试执行速度慢一个数量级。

Entity Framework对分离关注点等基本软件设计原则的忽视损害了团队进行演进式设计和增量交付的能力。"

明目张胆地从这里盗取: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/


2
如果您专注于DAL生成工具,那么将很难将其与TDD集成。我所知道的大多数dal生成工具也会生成您的业务对象并将它们紧密耦合到DAL中,从而使测试变得困难。
您可以查看OR映射工具,例如nHibernate和可能的Linq to sql,它们支持“持久性无知”,您可以自己定义业务对象,它们与DAL或任何其他基础设施代码没有联系。这使得单独测试业务逻辑与数据库变得更加容易。我发现它还能更好地支持其他场景,例如偶尔连接的客户端。

0

这个答案已经改为“是的,你可以”。

你可以使用自定义的T4模板(例如https://entityinterfacegenerator.codeplex.com/)生成POCO和接口,然后创建模拟对象来测试EF的输入输出,而不必访问数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接