2009-12-29 105 views
7

我已经在本文中用EF4中的POCO伪造了对象上下文和IObjectSet来实现单元测试。实体框架4.0单元测试

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/

但是,这将意味着我的真实资料库心不是正在测试,似乎只是绕过这个问题。

谁能提供任何建议?

回答

11

据我可以告诉你的问题,你试图在同一时间测试太多。记住Single Responsibility Principle

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

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

对象上下文是使用EF的具体Repository实现的实现细节。其他实现可能完全不需要对象上下文。

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

+0

伟大的答案IMO – 2010-10-21 11:17:55

+0

伟大的答案确实如此。你知道任何有效的方法来测试存储库吗?理想情况下,我会为此使用内存数据库,除非EF4在没有重大修改的情况下无法使用。 – 2010-12-08 22:49:22

+0

我不知道EF4(我已经或多或少地放弃了EF),但在以前的版本中,没有任何接口能以任何简单的方式启用内存数据库。从理论上讲,由于EF基于可扩展的提供者模型,因此如果可以找到提供者,则可以将内存中的数据库用作底层数据库,但我不知道其中的任何提供者。然后,我再也没有看很久...... – 2010-12-09 04:27:04

0

是否有可能使用内存数据库(如SQLite)测试实际存储库?有一个实体框架的SQLite提供程序。

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

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

+0

只要有一个支持EF的数据库提供者,用EF转出数据库并不是很难。这里有一篇关于如何完成这个任务的好帖子:http://mosesofegypt.net/post/Multiple-database-support-with-Entity-Framework.aspx – Odrade 2010-12-14 17:22:29