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

Unit testing 是否可以存根实体框架上下文和类来测试数据访问层?,unit-testing,entity-framework,mocking,data-access-layer,Unit Testing,Entity Framework,Mocking,Data Access Layer,我熟悉ASP.NETMVC应用程序中用于测试控制器和业务逻辑的技术 我们应用程序中的数据访问集中在松散耦合的特殊服务中,使用接口并通过实体框架与实际数据库协作 然而,随着DAL变得越来越复杂,隐藏了数据库实现细节并提供了带有抽象的应用程序代码,我们开始担心是否能够通过任何方式对其进行测试。因为它已经紧密地绑定到EF上下文,所以我们不打算引入另一个存储库样式的层,但是这也意味着我们不能仅仅用假数据对它进行单元测试 我想知道是否有可能以某种方式模拟或存根实体框架对象上下文,同时能够执行添加/删除实体

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

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

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

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


我也在寻找关于这是否是一个好主意(也许真的很糟糕)的意见,如果不是,一些“智能”数据层测试建议。

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


我在几个答案(例如和)中讨论过,这确实没有帮助,因为您没有测试真正的代码。非常大的问题是,一旦您模拟/存根EF代码,您就会用linq to对象替换linq to实体。另一个问题是,您正在丢失持久化实体的引用完整性。因此,我认为DAL、持久性和查询应该包含在使用real EF和real DB的集成测试中。

我认为应该删除asp.net-mvc标记。当你有一个松散耦合的数据访问层时,上面是什么并不重要。@steenhulthin,你说得对。是的。看看这篇文章:。我100%同意。很容易陷入这样一个陷阱:认为您正在对逻辑进行单元测试(即,将表达式传递给LINQ方法)。但是,由于在单元测试中使用的是完全不同的LINQ提供程序,因此这些表达式在运行时可能完全无效。