Как мне проверить / смоделировать / использовать трекер изменений Entity Framework при тестировании?
Для моего примера ниже я хотел бы убедиться, что поддельный список LogEntries начинается одним способом, и к тому времени, когда вызывается SaveChanges
, изменяется, чтобы соответствовать моим ожиданиям.
Сначала я думал о том, как открыть публичное свойство в FakeLogRepo
, которое показало бы мне поддельный список LogEntries, чтобы я мог легко сравнить до / после, но я все еще не могу понять, как обновить это без передачи чего-либо из LogInteraction
(так как в производственной среде Entity Framework обрабатывает это через свой трекер изменений).
Для упрощенного примера того, что у меня есть:
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;}
}
Когда в работе _logContext.SaveChanges()
делает то, что он должен, и обновляет измененные записи с помощью волшебства трекера изменений Entity Framework. Однако в тестировании я не использую БД, я хотел бы использовать фиктивный список LogEntry для имитации этого. Поскольку List
не имеет трекера изменений, я думал о том, чтобы он наследовал от IObservableCollection
, но не мог понять, как его использовать без существенного рефакторинга моего кода. Фактически, любая моя идея предполагает существенную переписку моего кода только для работы с тестом (и оставит неиспользуемый / посторонний код в производстве).
Я лаю не на том дереве и мне нужно изменить свое мышление в целом, или я просто не вижу то, к чему я близок?