单元测试EF4存储库代码

时间:2011-09-20 08:51:17

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

在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声明吗?

3 个答案:

答案 0 :(得分:2)

你对单元测试有什么讽刺意味,你有一个静态的方法......

想一想:Static methods are death to testability

还与你的问题有关..如果你没有业务逻辑那么真的不需要单元测试存储库代码因为你基本上最终会测试ORM作为你的单元测试的一部分,这是不必要的,因为ORM编写者会有已经照顾好了。

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

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

由于它具有业务逻辑,您可以将其移动到表示其正在执行的操作的单独类中。然后你的repo仍然可以作为界面,但你将moq新类将使用的数据..

答案 1 :(得分:1)

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

答案 2 :(得分:0)

最后,我重构了静态类,并在EF上创建了一个非常薄的层,只返回IQueryable类型。通过接口实现,可以使用Moles轻松地对该类进行存根。以下博客文章中提供了完整说明: