代码之家  ›  专栏  ›  技术社区  ›  Steve Ward

实体框架4.0单元测试

  •  7
  • Steve Ward  · 技术社区  · 15 年前

    我已经用一个假的对象上下文实现了本文中的单元测试,并用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和存储过程,但是我不能(很容易)在我的伪对象上下文中实现它们。

    另一种选择是使用存储库的测试double,而不是这里建议的对象上下文的double:

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

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

    有人能提出任何建议吗?

    2 回复  |  直到 13 年前
        1
  •  11
  •   Mark Seemann    15 年前

    从这个问题上我可以看出,你在试图同时进行太多的测试。保留 Single Responsibility Principle 铭记在心。

    当我们进行单元测试时,我们使用抽象存储库从应用程序的其余部分抽象数据访问代码。从这个角度来看,我们只是在测试 消费者 而不是任何具体的知识库。这些消费者应该关心 只有 关于存储库,而不是任何“对象上下文”——这将是 泄漏提取 .

    假设您被意外地要求将存储库使用者连接到完全不同的数据层(例如,基于REST的服务)。在这种情况下,即使是抽象对象上下文也没有意义。你可能从来没有想过会发生这种情况,但即便如此,仅凭思想实验就可以很好地指示抽象概念的泄漏。

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

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

        2
  •  0
  •   Marcus    14 年前

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

    似乎EDMX文件中的ssdl部分耦合到了提供程序。如果从SQL Server数据库生成模型,将设置provider=“system.data.sqlclient”。如果从实体模型生成SQL Server数据库,也将设置此选项。

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