1

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

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

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

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

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

你怎么看?

4

1 回答 1

1

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

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

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

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

于 2013-02-20T20:30:03.640 回答