使用实体框架更改跟踪器进行单元测试

时间:2018-05-07 16:42:51

标签: c# entity-framework unit-testing

测试时如何测试/模拟/使用Entity Framework的更改跟踪器?

对于我下面的示例,我想验证LogEntries的虚假列表是从一种方式开始的,并且在调用[\d_]时,会被修改以符合我的期望。

我最初想的是在SaveChanges中公开一个公共属性,它会向我显示LogEntries的虚假列表,以便我可以轻松地比较之前/之后,但我仍然无法弄清楚如何更新它而不传递FakeLogRepo中的内容(因为在生产中,实体框架通过其更改跟踪器处理它)。

有关我所拥有的简化示例:

LogInteraction

在生产中,public class LogInteraction : ILogInteraction { private readonly ILogRepo _logRepo; public LogInteraction(ILogRepo logRepo) { _logRepo = logRepo; } public void UpdateLog(IEnumerable<Detail> details) { foreach (var detail in details) { var record = _logRepo.GetById(detail.Id); record.Status = detail.Status; record.Message = detail.Message; } _logRepo.UpdateLogEntries(); } } public class LogRepo : ILogRepo { private readonly LogContext _logContext; public LogRepo() { _logContext = new LogContext(); } public LogEntry GetById(int id) { return _logContext.LogEntries.Single(r => r.Id == id); } public void UpdateLogEntries() { _logContext.SaveChanges(); } } public class LogContext : DbContext { public DbSet<LogEntry> LogEntries {get; set;} } 执行它应该做的事情,并通过Entity Framework的更改跟踪器的魔力更新已更改的记录。但是在测试中我没有使用数据库,我想使用一个假的LogEntry列表来模拟这个。由于_logContext.SaveChanges()没有更改跟踪器,因此我考虑将其从List继承,但如果没有我的代码的实质重构,则无法弄清楚如何使用它。事实上,我的任何想法都涉及对代码进行大量重写,只是为了处理测试(并且会在生产中留下未使用/无关的代码)。

我是在咆哮错误的树,需要彻底改变我的心态,还是我只是没有看到我接近的东西?

0 个答案:

没有答案