【问题标题】:Unit Testing Entity Framework单元测试实体框架
【发布时间】:2023-04-09 04:14:02
【问题描述】:

我刚刚开始使用 Entity Framework(v4) 和 Linq。

我有一个实体数据模型,它是从数据库生成的。然后我实现了存储库类,以便为我的实体实现业务逻辑,它们包含用于与实体/数据库交互的 LINQ 查询。

在不访问数据库的情况下对存储库类中的方法/函数进行单元测试的最简单和最简单的方法是什么?

【问题讨论】:

  • 你必须使用模拟框架,我的建议是使用 Rhino-Mocks
  • 见这篇文章:bit.ly/bF7jL3.
  • 不要使用模拟框架。从长远来看,它们只会使您的单元测试难以阅读,因此难以维护。

标签: .net linq unit-testing entity-framework repository


【解决方案1】:

您可以针对内存数据库运行测试。 Check this question

【讨论】:

  • 我同意杰森的观点。 Ladislav Mrnka 在引用的问题中给出的选项确实意味着您仍然需要在每次测试后清理数据库或运行数据库事务中的所有内容。换句话说,在这种情况下,您仍在进行集成测试而不是单元测试。
  • 我同意@Jason 和@Steven。这些肯定是集成测试。它们将在内存中运行以提高速度,并使用受控的输入数据。每次测试后,都需要清理并重新填充数据,以确保测试不会相互影响。
  • @jfar。我不是在谈论测试 Linq to objects 提供程序,而是实际测试真正的数据访问层。我建议不要使用原始数据库,而是应该使用轻量级或内存数据库。
【解决方案2】:

找到一个允许您创建模型存储库的框架。一开始这需要时间,但从长远来看会有所回报。

【讨论】:

    【解决方案3】:

    如果您可以将IDbSet 传递到它正在查询的存储库中,您可以轻松编写自己的IDbSet 存根实现,它可以读取和写入映射到IQueryable 的内存中集合,或使用模拟框架为您完成。

    在您的生产代码中,您从真正的DbContext 中传入IDbSet;在你的测试代码中,你传入这个存根。

    如果您正在测试的存储库引用 DbContext,那么您可能需要重构,使其仅引用单个 IDbSet

    【讨论】:

      【解决方案4】:

      我假设您只是不想在测试中加载/保存任何实体(即:仅测试您的业务逻辑,而不是持久层)。在这种情况下,您将需要一种轻松生成(和重用)测试“存根”的方法。 imo 最简单的方法是为您返回一些简单(但有意义)实体的各种实体创建一些工厂。

      例如,如果您正在测试您的用户引擎,您可能希望有一个测试工厂来生成不同类型的用户,可能是威斯康星州的用户,或者姓氏很长的用户,或者没有朋友,与有 100 个朋友的用户等。

      public static class UserStubFactory {
          static User NewUserWithLongLastName(int letterCount) {  //return user with long last name  }
          static User NewUserWithXFriends(int count) { //return user w/ X friends }
      }
      

      然后,当您生成其他测试存根工厂时,您可以开始将它们链接在一起。因此,也许您想测试一个姓氏很长的用户,然后让他们在您的系统中执行一些其他操作。现在你已经有了 TestStub,所以你可以简单地调用 NewUserWithLongLastName() 并将他传递给你的引擎。

      如果您不使用此方法,您也可以使用构造函数语法即时创建它们。

      User newUser = new User() {  LastName ="HOLYCOWTHISISAVERYYLONGLASTNAME"; }
      

      但我更喜欢工厂,因为它们的可重用性因素。

      【讨论】:

      • NO NO - 不要使用 linq 提供程序编写集成测试。 Linq to objects 将在 100% 的时间内工作。基于 sql 的 linq 提供程序将在“某些时候”工作,因为某些表达式树无法转换为 sql。您的测试可能会通过,但代码会在运行时失败。
      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2023-03-22
      • 2011-05-28
      • 2014-08-10
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多