实体框架6和单元测试
问题描述:
我一直在四处寻找一个解决方案,但我无法找到答案(如here和here)实体框架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
那么你可以在单元测试项目中模拟你的连接字符串。