Gil*_*les 8 linq unit-testing entity-framework
在我的解决方案中,我有单元测试,它不依赖于数据库,而是具有外部依赖性(如数据库)的模拟和集成测试.
当我使用模拟进行单元测试时,使用LINQ to Object.当集成测试或实际程序运行时,使用LINQ to Entities,它比LINQ to Object更严格.
有没有办法在单元测试中复制LINQ To Object更严格的行为?
一旦您的单元测试逻辑与IQueryableEF提供的一起使用,您就无法通过模拟EF来进行单元测试.这将始终导致从linq到实体切换到linq到对象.在简化的情况下,在单元测试中处理此问题的正确方法是写假而不是模拟.假将模拟依赖的行为.在这种情况下,编写伪造意味着编写EF提供程序在内存中进行处理,其方式与实际提供程序与数据库一起工作的方式完全相同.编写这样的提供者可能是项目本身.
因此,一旦您的逻辑包含linq-to-entities查询,您应该始终使用集成测试对其进行测试或重构代码,以便查询本身处于单独的方法中(通过集成测试进行测试),而以前的逻辑现在依赖于包含而不是EF本身的方法 - 这会导致存储库模式IQueryalbe未公开,但存储库公开了在某个实体上运行的每个所需查询的方法.我个人不喜欢这种存储库.这是最近关于不同存储库实现的讨论.
如果您决定使用集成测试将数据库更改为内存,则可以使用EFv4.1和代码,只需将连接字符串更改为SQL Compact 4即可,它将起作用(除非您使用某些特殊的直接SQL调用或要求映射中的一些特殊SQL类型).对于带有EDMX文件的EF,它将无法工作,因为EDMX文件与精确的数据库版本紧密耦合.对于单元测试而言,使用特殊的EDMX不是一种选择,因为您将再次测试不同的代码.
以下是一组相关问题,讨论单元测试EF代码和存储库的挑战.
| 归档时间: | 
 | 
| 查看次数: | 1691 次 | 
| 最近记录: |