Я прочитал примеры на JustMock (у нас есть платная версия FYI), но у меня возникают трудности с обновлением записи (без добавления).
У меня есть ILogRepo
public interface ILogRepo
{
DbSet<LogEntry> LogEntries { get; }
LogContext LogContext { get; }
}
У меня есть LogInteraction
public class LogInteraction : ILogInteraction
{
private readonly ILogRepo _logRepo;
public LogInteraction(ILogRepo logRepo)
{
_logRepo = logRepo;
}
public void UpdateLog(IList<AckDetail> ackDetails)
{
foreach (var ackDetail in ackDetails)
{
var logRecord = _logRepo.LogEntries.Single(r => r.CheckNum == ackDetail.CheckNo);
logRecord.ProcessingStatus = ackDetail.Result.ToString();
if (!string.IsNullOrWhiteSpace(ackDetail.Message))
{
logRecord.Message = ackDetail.Message;
}
}
_logRepo.LogContext.SaveChanges();
}
}
Я издевался над поддельным LogEntries (это IList). И последнее, но не менее важное - тест
[TestFixture]
public class LogTests
{
private ILogRepo _mockLogRepo;
private ILogInteraction _uut;
private IList<AckDetail> _fakeAckDetails;
[SetUp]
public void SetUp()
{
//Arrange
_mockLogRepo = Mock.Create<ILogRepo>();
_fakeAckDetails = FakeAckDetails();
_uut = new LogInteraction(_mockLogRepo);
}
[Test]
public void LogUpdated()
{
//Arrange
var expectedResults = FakeLogEntries_AfterAckProcessing();
var expectedJson = JsonConvert.SerializeObject(expectedResults);
_mockLogRepo.Arrange(m => m.LogEntries).IgnoreInstance().ReturnsCollection(FakeLogEntries_AfterSending());
//Act
_uut.UpdateLog(_fakeAckDetails);
var actualResults = _mockLogRepo.LogEntries.ToList();
var actualJson = JsonConvert.SerializeObject(actualResults);
//Assert
Assert.AreEqual(expectedResults.Count, actualResults.Count);
Assert.AreEqual(expectedJson, actualJson);
}
}
В моем тесте мой _mockLogRepo не обновляется моим LogInteraction. Пошаговый код кажется все хорошо и хорошо. Если я проверяю контекст и смотрю на изменения, это возвращает ложь. Я думаю, что я соответствовал примеру на сайте Telerik довольно хорошо, но мне удалось найти информацию только по добавлению (и путем экстраполяции, удаления). Но так как эти два фактических метода и Обновление не в Entity Framework, я немного растерялся. Мой код будет работать в производственном процессе, но я бы хотел, чтобы он работал и в Test (весь смысл).