测试时如何测试/模拟/使用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
继承,但如果没有我的代码的实质重构,则无法弄清楚如何使用它。事实上,我的任何想法都涉及对代码进行大量重写,只是为了处理测试(并且会在生产中留下未使用/无关的代码)。
我是在咆哮错误的树,需要彻底改变我的心态,还是我只是没有看到我接近的东西?