是否可以将实体框架上下文和类存根以测试数据访问层?

Dan*_*mov 2 unit-testing entity-framework data-access-layer mocking

我熟悉ASP .NET MVC应用程序中用于测试控制器和业务逻辑的技术.

我们的应用程序中的数据访问集中在特殊服务中,这些服务是松散耦合的,使用接口并通过实体框架与实际数据库一起工作.

但是,随着DAL变得越来越复杂,隐藏数据库实现细节并为应用程序代码提供抽象,我们开始关注我们是否能够以任何方式对其进行测试.因为它已经与EF上下文紧密绑定,所以我们不打算引入另一个存储库样式的层,但这也意味着我们不能仅使用伪数据对其进行单元测试.

我想知道是否有可能以某种方式模拟或存根Entity Framework对象上下文,同时能够执行简单的操作,如添加/删除实体和进行查询.

我也在寻找关于它是否是一个好主意(可能非常糟糕)的意见,如果不是,那么一些"智能"数据层测试建议.

Lad*_*nka 11

如果您IObjectSet为派生ObjectContext实例使用自定义接口并且所有EF相关代码仅通过这些接口访问EF功能(将注入上下文),则部分可以使用模拟/存根EF .每个其他EF相关功能必须隐藏在对象上下文接口上公开的方法中.

我在几个答案中讨论过(例如这里这里),这实际上没有用,因为你没有测试真正的代码.最大的问题是,一旦你模拟/存储EF代码,你就会用linq-to-objects替换linq-to-entities.另一个问题是您正在丢失持久化实体的参照完整性.因此我认为DAL,持久性和查询应该使用真实数据库中的真实EF进行集成测试.