Модульное тестирование с помощью трекера изменений Entity Framework - PullRequest
0 голосов
/ 07 мая 2018

Как мне проверить / смоделировать / использовать трекер изменений 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, но не мог понять, как его использовать без существенного рефакторинга моего кода. Фактически, любая моя идея предполагает существенную переписку моего кода только для работы с тестом (и оставит неиспользуемый / посторонний код в производстве).

Я лаю не на том дереве и мне нужно изменить свое мышление в целом, или я просто не вижу то, к чему я близок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...