【问题标题】:TDD and ADO.NET Entity FrameworkTDD 和 ADO.NET 实体框架
【发布时间】:2008-11-25 10:14:01
【问题描述】:

我最近一直在使用 ADO.NET Entity Framework,我发现它适合我正在开发的项目的需求。我也觉得它的非侵入性很酷。

从现有数据库生成数据模型后,您将面临集成生成模型和业务逻辑的任务。更具体地说,我习惯于集成测试通过 DAL 接口的模拟/存根与数据存储交互的类。问题是您无法使用 ADO.NET Entity Framework 执行此操作,因为它生成的实体是没有接口的简单类。

问题是:如何将TDD 方法 应用到使用ADO.NET Entity Framework 的应用程序的开发中?这甚至可能吗,还是我应该迁移到另一个 DAL 生成工具集?

【问题讨论】:

标签: unit-testing entity-framework ado.net tdd integration-testing


【解决方案1】:

对实体框架的一大批评是它本身就很难测试,例如 gef 引用的 ALT.Net Vote of No Confidence

Here is a blog post 讨论如何在使用 Entity Framework 时解决此问题,并能够在不访问数据库的情况下测试您的代码。

如果可测试性是一个大问题,您可能想看看另一个 ORM 框架,例如 NHibernate,至少在 Entity Framework 2.0 发布之前。

【讨论】:

  • 很好地参考了那篇博文,尽管对于一个在 EF 2.0 之后将不存在的问题似乎需要做很多工作......
  • 我否决了这个答案,因为现在可以为 EF 创建单元测试。 EF变化很大。见stackoverflow.com/a/23598884/3481183
【解决方案2】:

虽然原来的问题已经回答了,但我觉得我可以补充一点:

我目前在我正在构建的 Intranet 站点上使用 Entity Framework 4.0。我可以使用已添加的 POCO 支持在没有数据库连接的情况下测试我的业务逻辑和控制器中的所有内容。

虽然 POCO 可以从 VS 2010 中包含的新 t4 模板生成,但我在 VS 2010 中找不到的东西是用于生成对象上下文的 t4 模板(对象上下文基本上用作EF 的内置工作单元,对于将 EF 对象映射到 POCO 至关重要)。幸运的是,Joachim Lykke Andersen 在他的博客文章 Entity Framework 4.0 Beta 1 – POCO, ObjectSet, Repository and UnitOfWork 中写了一个 t4 模板来生成它,它非常有帮助。如果您使用无需数据库连接即可测试的 EF4 解决方案,我强烈建议您实施与他的解决方案类似的解决方案,其中包括通用存储库、工作单元包装器和工作单元工厂。很有帮助。

祝你好运。

【讨论】:

  • 以上链接失效了,还有什么地方可以参考t4模板吗?如果有请通过。
  • 我更新了帖子以感谢博客作者 Joachim Lykke Andersen,并将链接更改为 2010 年 10 月 30 日 Wayback Machine 存档。
【解决方案3】:

我同意 Entity Framework 的第 1 版是对设计的犯罪,它肯定得到了我的不信任票。我感谢 EF 产品团队承认失败并通过向社区开放他们的设计过程来做出回应。下一个版本不会是完美的,它甚至可能还没有准备好用于生产级应用程序,但我认为他们终于开始理解对于那些知道糟糕的设计是糟糕的业务的用户来说什么是重要的。话虽这么说……我还是很怀疑。持续的设计时反馈对这些人来说是新事物,我已经阅读了 ADO.NET 博客上的很多声明,这些声明引发了明亮的危险信号。我们将看到 .NET 4.0 的发布情况如何。

他们似乎在尝试:

Test-Driven Development Walkthrough with the Entity Framework 4.0

【讨论】:

    【解决方案4】:

    "持久化的紧耦合 实体类的基础设施 在很大程度上消除了能力 有效地使用非常严格的反馈 业务逻辑上的循环 自动化测试。在其当前 状态,EF 实体类不能 有效的独立单元测试 数据库。

    自动化单元的效率 行为对象的测试是 很大程度上取决于如何容易 测试数据设置的机制是和 测试的执行速度。 使用实际的数据库将使 测试数据设置比较费力, 引入数据以满足关系 不相关的约束 测试,并使测试执行成为 慢一个数量级。

    团队进行进化的能力 设计和增量交付是 实体框架的损坏 忽视基础软件 设计原则,如分离 担忧。”

    从这里公然偷走: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/

    【讨论】:

      【解决方案5】:

      如果您专门研究 DAL 生成工具,您将很难将其与 TDD 集成。我知道的大多数 dal 生成工具也会生成您的业务对象并将它们与 DAL 紧密耦合,从而使测试变得困难。

      您可以查看诸如 nHibernate 之类的 OR-mapping 工具,也许还有 Linq to sql 启用“持久性无知”,您可以自己定义业务对象,它们与 DAL 或任何其他基础架构代码没有链接。这使得与数据库分开测试您的业务逻辑变得更加容易。我发现它还可以更好地支持其他场景,例如偶尔连接的客户端。

      【讨论】:

        【解决方案6】:

        此答案已更改为“是的,您可以”。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2011-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多