【问题标题】:Unit testing EF4 Repository Code单元测试 EF4 存储库代码
【发布时间】:2011-09-20 08:51:16
【问题描述】:

在 EF4 存储库中为以下 GetMyObjectsFiltered(...) 方法编写单元测试的好方法是什么:

public static class MyRepository
{
    public static List<MyObject> GetMyObjectsFiltered(string searchFilter)
    {
        var myQueryableObjects = GetMyObjects(searchFilter);

        if (false == string.IsNullOrWhiteSpace(searchFilter))
        {
            myQueryableObjects = myQueryableObjects.Where(o => o.MyProperty.Contains(searchFilter));
        }

        return myQueryableObjects.ToList();
    }

    private static IQueryable<MyObject> GetMyObjects(string searchFilter)
    {
        using (MyDB_ModelContainer model = new MyDB_ModelContainer())
        {
            return model.MyTable.AsQueryable();
        }
    }

}

我可以注入MyDB_ModelContainer 并仍然使用using 语句吗?

【问题讨论】:

    标签: unit-testing entity-framework dependency-injection mocking repository


    【解决方案1】:

    你问的关于单元测试的问题真是讽刺,你有一个静态方法..

    读这个:Static methods are death to testability

    也与您的问题有关.. 如果您没有业务逻辑,则实际上不需要单元测试存储库代码,因为您基本上最终会将 ORM 作为单元测试的一部分进行测试,而 ORM 编写者将没有必要这样做已经处理好了。

    如果您将静态方法重构为另一个接口实现,那么您可以模拟该接口的实现并将其注入您的类中。模拟的实现将根据各种条件返回您想要测试的数据。

    我建议你看看像 moq 这样的模拟框架。

    由于它具有业务逻辑,您可能可以将其移至代表它正在做什么的单独类。那么您的 repo 仍然可以是接口,但您将 moq 新类将使用的数据..

    【讨论】:

    • 那里有一些业务逻辑 - GetMyObjectsFiltered() 方法正在返回数据的子集。我同意GetMyObjects() 不需要测试...
    • 如果需要,我可以重构静态输出。
    • 单元测试存储库 a) 错误 b) 不需要。您很可能正在使用存储库通过模拟存储库而不是通过模拟存储库内部的内容来对您的上层进行单元测试——这是一个很大的区别。如果您的存储库代码涉及 EF 并使用 linq-to-entities,则无法对其进行有效的单元测试 - 它必须通过集成测试进行测试,但您的上层可以使用模拟存储库进行单元测试(除非它公开 IQueryable 或使用表达式)。 Here 就是一个例子。
    • 好的,我期望提供一个模拟框架。我正在使用 JustMock 并希望确保这是一种明智的方法,谢谢 :-)
    【解决方案2】:

    没有办法对存储库代码进行单元测试。存储库代码包装了数据访问,因此唯一合理的测试是与真实数据库的集成 = 没有模拟或伪造,而是执行真实代码并评估它从测试数据库返回正确的结果。

    【讨论】:

      【解决方案3】:

      最后我重构了静态类,并在 EF 上做了一个非常薄的层,它只返回 IQueryable 类型。通过一个接口实现这个类然后可以很容易地使用Moles 存根。以下博客文章提供了完整的描述:

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多