实体框架4.0单元测试

Ste*_*ard 7 testing unit-testing entity-framework

我已经在本文中使用假对象上下文和在EF4中使用POCO的IObjectSet实现了单元测试.

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/

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

有人可以提供任何建议吗?

Mar*_*ann 11

据我所知,你试图在同一时间测试太多.保持单一职责原则的初衷.

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

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

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

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