【问题标题】:When I do not expose IQueryable then I have not to do integration tests当我不公开 IQueryable 时,我不必进行集成测试
【发布时间】:2013-02-20 16:11:51
【问题描述】:

我已经阅读了很多关于实体框架的单元/集成测试的 SO 链接,如果我没有误解的话,总结一下:

当存储库接口公开 IQueryable 时,我必须进行集成测试(单元测试还不够),因为作为 linq 到实体的 IQueryable 可以变成 linq 到对象查询,它的行为完全不同,只能测试有一个真实的数据库。

当存储库接口仅公开 IEnumerable 或 List 时,对存储库进行单元测试就足够了。

我知道在我的服务中编写一个 IQueryable 而不添加许多新的接口方法会非常酷...

但如果上述情况属实,并且我想尽可能避免集成测试......

你怎么看?

【问题讨论】:

  • 我不同意如果您通过存储库公开 IQueryable 结果必须使用 Db 连接测试它们的断言。更大的问题是你想要练习什么代码?您是要测试存储库中的业务逻辑(开始时不应包含太多业务逻辑),还是要测试数据库结构是否支持 EF 基于您的模型生成的查询?
  • 我的存储库包含零业务逻辑,因此我有一个服务。我想要你提到的后者。

标签: entity-framework


【解决方案1】:

当存储库接口只公开 IEnumerable 或 List 它是 足以对存储库进行单元测试。

没有。那是误解。当存储库仅公开 IEnumerableList 时,可以安全地伪造或模拟它并使用存储库对逻辑进行单元测试。存储库本身仍然必须包含集成测试,因为它定义了必须针对真实数据库进行测试的数据库查询。

将查询隐藏在存储库后面的主要原因是分离关注点并在应用程序逻辑和数据库执行逻辑(查询)之间定义严格的边界。每个逻辑都需要自己的测试。

您提到的问题最有可能讨论过模拟或伪造 EF 上下文/EF 集或暴露 IQueryable 的存储库。在这种情况下,存储库将数据库执行的逻辑暴露给上层,这使得正确的测试变得更加困难。在这种情况下,您需要对应用程序逻辑进行单元测试,并使用 Linq-to-objects 以某种方式伪造 Linq-to-entities(数据库逻辑)。但是这样的测试不足以测试这些查询,因此您还需要集成测试,这将复制您的部分单元测试。

【讨论】:

  • 好的。我现在明白了。但是,如果我的集成测试涵盖了所有存储库方法,我为什么还要对存储库进行单元测试呢?或者这是关于集成测试与单元测试的一般性辩论?我知道单元测试可以更容易/更快地找到有问题的代码,但总的来说,我认为集成测试足以涵盖所有内容,它们只是速度较慢且不易维护等......
  • 一般来说,你不需要单元测试来覆盖存储库(除非有一些应用程序级别的逻辑需要测试)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多