实体框架6和单元测试

问题描述:

我一直在四处寻找一个解决方案,但我无法找到答案(如herehere实体框架6和单元测试

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

我使用的将所有的方式来测试该代码到DB。我知道这不是一个好习惯,因为这种情况下的单元测试也会测试与数据库的连接。

理想情况下,我想构建一个内存数据库并对其进行种子处理。在这种情况下我会怎么做?如何伪造ItemContext来使用内存列表?

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

您不能假冒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那么你可以在单元测试项目中模拟你的连接字符串。