我在 EF4 中使用伪造的对象上下文和带有 POCO 的 IObjectSet 按照本文的思路实现了单元测试。
但我不确定如何在我的假对象上下文中实现几个方法来进行测试。我的对象上下文接口(interface)上有 CreateQuery 和 ExecuteFunction 方法,因此我可以执行 ESQL 和存储过程,但我不能(轻松地)在我的假对象上下文中实现它们。
另一种方法是使用我的存储库的测试替身,而不是这里建议的我的对象上下文的替身:
http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/c4921443-e8a3-4414-92dd-eba1480a07ad/
但这意味着我的真实存储库没有经过测试,似乎只是绕过了这个问题。
有人可以提供任何建议吗?
最佳答案
据我从问题中可以看出,您试图同时测试太多。保留 Single Responsibility Principle记在心里。
当我们进行单元测试时,我们使用抽象存储库将数据访问代码从应用程序的其余部分中抽象出来。从这个角度来看,我们只是在测试存储库的消费者,而不是任何具体的存储库。这样的消费者应该只关心存储库,而不关心任何“对象上下文”——那将是有漏洞的抽象。
想象一下,您意外地被要求将您的 Repository 消费者连接到一个完全不同的数据层(例如,一个基于 REST 的服务)。在这种情况下,即使是抽象的对象上下文也没有意义。您可能永远不会预料到会发生这种情况,但即便如此,仅凭思想实验就可以很好地指示抽象漏洞。
对象上下文是使用 EF 的具体 Repository 实现的实现细节。其他实现可能根本不需要对象上下文。
也就是说,您可能仍想测试 EF 实现本身。这可能很有意义,但这是一个具有完全不同目的的不同单元测试套件。您现在不是在测试抽象存储库的消费者,而是在测试存储库的具体实现。在这种情况下,无需通过接口(interface) - 您可以在此处直接与具体类型对话。
关于unit-testing - Entity Framework 4.0 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972764/