我已经阅读了很多关于实体框架的单元/集成测试的SO链接,如果我没有误解,可以总结一下:
当存储库接口公开IQueryable时,我必须进行集成测试(单元测试是不够的)因为实体的linq的IQueryable可以变成linq到对象查询,它可以表现完全不同,只能测试有一个真正的数据库。
当存储库接口仅公开IEnumerable或List时,它就足以对存储库进行单元测试。
我知道在我的服务中编写IQueryable而不添加许多新的界面方法会非常酷......
但如果上述情况属实,我想尽可能避免集成测试......
您怎么看?
答案 0 :(得分:1)
当存储库接口仅公开IEnumerable或List时 足以对存储库进行单元测试。
没有。这是误会。当存储库仅公开IEnumerable
或List
时,伪造或模拟它是安全的,并使用您的存储库对逻辑进行单元测试。存储库本身必须仍然包含集成测试,因为它定义了必须针对真实数据库进行测试的数据库查询。
隐藏存储库后面的查询的主要原因是分离关注点并定义应用程序逻辑和数据库执行逻辑(查询)之间的严格边界。每个逻辑都需要自己的测试。
您最常提到的问题可能是讨论模拟或伪造EF上下文/ EF集或存储库IQueryable
。在这种情况下,存储库将数据库执行的逻辑暴露给上层,这使得正确的测试更加困难。在这种情况下,您需要对应用程序逻辑进行单元测试,并以某种方式伪造Linq到实体(数据库逻辑)与Linq到对象。但是这样的测试还不足以测试这些查询,因此您还需要集成测试,这将复制部分单元测试。