Entity Framework 4.0单元测试

7
我已经按照这篇文章的思路使用虚假对象上下文和带有POCO的IObjectSet在EF4中实现了单元测试。

http://blogs.msdn.com/adonet/archive/2009/12/17/test-driven-development-walkthrough-with-the-entity-framework-4-0.aspx

但我不确定如何在我的虚拟对象上下文中实现一些测试方法。我的对象上下文接口上有CreateQuery和ExecuteFunction方法,以便我可以执行ESQL和存储过程,但我不能(轻松地)在我的虚拟对象上下文中实现它们。

另一种选择是使用我的存储库的测试替身而不是我的对象上下文的替身,就像这里建议的那样:

http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/c4921443-e8a3-4414-92dd-eba1480a07ad/

但这意味着我的真实仓库没有被测试,似乎只是绕过了这个问题。有人能提供任何建议吗?
2个回答

11
据我所知,根据问题描述,您正在尝试同时测试太多内容。请记住单一职责原则
在进行单元测试时,我们使用抽象Repository将数据访问代码与应用程序的其余部分隔离开来。从这个角度来看,我们只测试Repositories的消费者,而不是任何具体的Repository。这些消费者应该关心Repositories,而不关心任何"对象上下文"——这将是一个泄漏的抽象
想象一下,您被意外要求将Repository消费者连接到完全不同的数据层(例如基于REST的服务)。在这种情况下,即使是抽象的对象上下文也没有意义。您可能永远不期望发生这种情况,但仅仅通过思想实验就足以说明泄漏的抽象。
对象上下文是使用EF的具体Repository实现的一个实现细节。其他实现可能根本不需要对象上下文。
话虽如此,您仍然可能想测试EF实现本身。这可能非常有意义,但这是一个完全不同目的的不同单元测试套件。您现在正在测试Repository的具体实现,而不是抽象Repository的消费者。在这种情况下,无需通过接口进行测试-您可以直接与具体类型交谈。

确实是个好答案。你知道测试存储库的有效方法吗?理想情况下,我会使用内存数据库进行测试,但EF4需要进行重大修改才能支持。 - Steven Evers
我对EF4并不了解(我已经基本放弃了EF),但在之前的版本中,没有任何简单的接缝可以启用内存数据库。理论上,由于EF基于可扩展的提供程序模型,如果您能找到提供程序,您可能能够将内存数据库用作底层数据库,但是我不知道是否存在这样的提供程序。不过,我很久没有寻找过了... - Mark Seemann

0

是否可以使用内存数据库(如SQLite)测试实际的仓储库?Entity Framework 存在一个 SQLite 提供程序。

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

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


只要您的数据库提供程序支持EF,使用EF切换数据库并不难。以下是一篇关于如何完成此操作的好文章:http://mosesofegypt.net/post/Multiple-database-support-with-Entity-Framework.aspx - Odrade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接