实体框架4.0单元测试

时间:2009-12-29 03:29:24

标签: unit-testing entity-framework testing

我已经在本文中使用伪对象上下文和带有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 个答案:

答案 0 :(得分:11)

据我所知,你试图在同一时间测试太多。记住Single Responsibility Principle

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

想象一下,您出乎意料地被要求将您的Repository消费者连接到一个完全不同的数据层(例如基于REST的服务)。在这种情况下,即使是抽象对象上下文也没有意义。你可能没想到会发生这种情况,但即便如此,仅凭思想实验就是漏水抽象的一个很好的指标。

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

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

答案 1 :(得分:0)

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

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

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