实体框架6和单元测试

时间:2017-02-14 21:20:00

标签: c# unit-testing entity-framework-6

我一直在寻找解决方案,但找不到答案(例如herehere。)

public class ItemsRepository {
    public ItemDto Get(int id) {
        using (var db = new ItemContext()) {
            return db.Items.FirstOrDefault(i => i.Id == id)
                .ToDto();
        }
    }
}

我曾经一直到数据库测试这段代码。我知道这不是一个好习惯,因为在这种情况下的单元测试也测试了与数据库的连接。

理想情况下,我想构建一个内存数据库并为其播种。在这种情况下我该怎么做?如何伪造ItemContext以使用内存列表?

请注意,我不想将Context公开为构造函数,因为用户必须知道数据的存储方式。

1 个答案:

答案 0 :(得分:1)

您不能伪造ItemContext,因为new关键字始终会创建对象的新实例。理想情况下,您应该通过依赖注入注入上下文。像这样:

public class ItemsRepository {
    public ItemDto Get(int id) {
       return _itemContextService.Items.FirstOrDefault(i => i.Id == id)
                .ToDto();            
    }
}

在单元测试_itemContextService中应注入,_itemContextService.Items应配置模拟数据。你应该单元测试的所有逻辑是:

FirstOrDefault(i => i.Id == id).ToDto();            

这只是Get(int id)方法的作用。与数据库的连接超出了单元测试此方法的范围。

无论如何,如果您不能使用某个DI容器或以某种方式注入ItemContext,那么您可以在单元测试项目中模拟您的连接字符串。