【问题标题】:EF4 - possible to mock ObjectContext for unit testing?EF4 - 可以模拟 ObjectContext 进行单元测试吗?
【发布时间】:2011-02-11 18:50:18
【问题描述】:

不使用 TypeMock Islolator 可以吗?我在网上找到了一些建议,例如传入仅元数据的连接字符串,但是除了 TypeMock 之外我遇到的任何东西似乎都没有真正允许可以注入服务以进行单元测试的模拟 ObjectContext。我应该为 TypeMock 支付 $$,还是有其他选择?没有人设法创建任何可以与 TypeMock 相媲美的开源软件吗?

【问题讨论】:

  • 我看到的一个建议是打破规则重新测试数据库。这家伙说他使用 CreateDatabase() 在本地动态创建一个“模拟”数据库实例。总的来说,我想避免这种情况,因为我们在之前的项目中违反了这条规则,但效果并不好。大约 600 次测试是可以的,但最后超过 2000 次测试对于真正的 TDD 来说完全没用,我们不时以“批处理模式”运行测试(运行它们需要 5 分钟或更长时间)。

标签: entity-framework mocking typemock objectcontext


【解决方案1】:

我在没有模拟的情况下轻松地对 EF4 进行单元测试。我所做的是使用http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/ 中的代码作为基础创建一个存储库接口,然后我创建了一个使用IRepository 接口的InMemoryRepository<T> 类。然后我在类中用List<T> 替换了IObjectSet<T>,并相应地更改了检索方法。

因此,如果您需要进行单元测试,请传入 InMemoryRepository 而不是 DataRepository。

【讨论】:

  • -1 Linq2Objects 的行为与 Linq2Entities 不同。您的测试可能会通过 List 但在被 EF 解析为 SQL 时会失败。
  • 如果不访问数据库就无法通过,所以我不确定你的意思是什么。模拟并不意味着您的 Linq2Entities 将始终有效并正常工作。
  • 封装您的查询并针对真实数据库进行测试。然后在测试您的业务逻辑时模拟它们。因此,每个查询都是一个可重用的组件,您知道事实会起作用。并且您的业务逻辑经过测试,无需处于预期状态的数据库。
【解决方案2】:

将您的 Linq2Entity 查询放在接口后面,针对真实数据库进行单元测试。

使用模拟查询接口为您的业务逻辑编写测试。不要让 Linq 渗入您的业务逻辑!

不要使用 RepositoryPattern!

【讨论】:

    【解决方案3】:

    将 ObjectContext 包装在代理类中。然后将其注入到你的类中。

    【讨论】:

    • 是的,我试过了,这是有可能的——但是所有这些使用代理的方法都有其自身的局限性。 Linq 在一件事情上的工作方式不同(使用 Linq 到对象,而不是 Linq 到实体)。
    • 没错,但是期望您的单元测试能够发现不同 Linq 实现中的差异,对于单元测试来说似乎有些过火了。你不觉得集成测试领域还有更多吗?
    【解决方案4】:

    我不认为存储库模式是问题的唯一答案(它确实避免了问题)

    我喜欢这个答案 - 我认为更适合将测试引入现有代码库 Creating Interface for ObjectContext

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2013-11-12
      • 2018-11-21
      • 2018-10-19
      相关资源
      最近更新 更多