Unit testing 实体框架4.0单元测试

Unit testing 实体框架4.0单元测试,unit-testing,entity-framework,testing,Unit Testing,Entity Framework,Testing,我已经按照本文的思路,在EF4中使用伪对象上下文和带有POCO的IOObjectSet实现了单元测试 但是我不确定如何在我的伪对象上下文上实现几个方法来进行测试。我在我的对象上下文接口上有CreateQuery和ExecuteFunction方法,因此我可以执行ESQL和存储过程,但我不能(轻松地)在我的伪对象上下文中实现它们 另一种选择是使用我的存储库的双重测试,而不是此处建议的双重对象上下文: 但这意味着我真正的存储库没有经过测试,似乎只是绕过了这个问题 有人能提供一些建议吗?据我从这个

我已经按照本文的思路,在EF4中使用伪对象上下文和带有POCO的IOObjectSet实现了单元测试

但是我不确定如何在我的伪对象上下文上实现几个方法来进行测试。我在我的对象上下文接口上有CreateQuery和ExecuteFunction方法,因此我可以执行ESQL和存储过程,但我不能(轻松地)在我的伪对象上下文中实现它们

另一种选择是使用我的存储库的双重测试,而不是此处建议的双重对象上下文:

但这意味着我真正的存储库没有经过测试,似乎只是绕过了这个问题


有人能提供一些建议吗?

据我从这个问题上看,你试图同时测试太多。记住这一点

当我们进行单元测试时,我们使用抽象存储库将数据访问代码从应用程序的其余部分抽象出来。从这个角度来看,我们只是测试存储库的使用者,而不是任何具体的存储库。这样的消费者应该只关心存储库,而不关心任何“对象上下文”——这将是一个泄漏的抽象

假设您意外地被要求将存储库使用者连接到完全不同的数据层(例如,基于REST的服务)。在这种情况下,即使是抽象对象上下文也没有意义。你可能永远不会期望这种情况发生,但即便如此,思想实验本身就是一个相当好的泄漏抽象的指示器

对象上下文是使用EF的具体存储库实现的实现细节。其他实现可能根本不需要对象上下文


也就是说,您可能仍然希望测试EF实现本身。这可能很有意义,但这是一个完全不同用途的不同单元测试套件。您现在正在测试存储库的具体实现,而不是测试抽象存储库的使用者。在这种情况下,不需要通过接口-您可以在这里直接与具体类型对话。

是否可以使用内存中的数据库(如SQLite)测试实际的存储库?存在实体框架的SQLite提供程序

edmx文件中的SSDL部分似乎与提供程序耦合。如果从Sql server数据库生成模型,则将设置provider=“System.Data.SqlClient”。如果您从实体模型生成sql server数据库,也将设置此选项


我真正想做的是让我的生产代码使用System.Data.SqlClient提供程序,让我的单元测试使用System.Data.SqLite提供程序。

答案确实不错。您知道测试存储库的有效方法吗?理想情况下,我会使用内存中的DB来实现这一点,除了EF4不能在没有重大修改的情况下工作。我不知道EF4(我或多或少放弃了EF),但在以前的版本中,没有任何接缝可以轻松地启用内存中的DB。从理论上讲,由于EF基于可扩展的提供程序模型,如果可以找到提供程序,您可以使用内存中的DB作为基础DB,但我不知道有任何提供程序。再说一次,我已经很久没有找了…用EF关闭DB不是很难,只要有一个支持EF的DB提供商。下面是一篇关于如何实现这一点的好帖子: