我一直在寻找解决方案,但找不到答案(例如here和here。)
public class ItemsRepository {
public ItemDto Get(int id) {
using (var db = new ItemContext()) {
return db.Items.FirstOrDefault(i => i.Id == id)
.ToDto();
}
}
}
我曾经一直到数据库测试这段代码。我知道这不是一个好习惯,因为在这种情况下的单元测试也测试了与数据库的连接。
理想情况下,我想构建一个内存数据库并为其播种。在这种情况下我该怎么做?如何伪造ItemContext以使用内存列表?
请注意,我不想将Context公开为构造函数,因为用户必须知道数据的存储方式。
答案 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
,那么您可以在单元测试项目中模拟您的连接字符串。