Модульные тесты и тестирование теста
Мое приложение имеет возможность обновить элемент. Я хотел бы создать модульный тест для этого.
Это в C# с использованием Moq. Когда я вызываю метод настройки в макете. Я получаю существующий элемент, а затем обновляю его по мере необходимости.
messageMock.Setup(m => m.SaveMessage(It.IsAny<Message>()))
.Callback((Message msg) =>
{
var oldMsg = _messages.FirstOrDefault(m => m.Id == msg.MessageID);
if (oldMsg != null)
{
oldMsg.Description = msg.Description;
oldMsg.IsActive = msg.IsActive;
oldMsg.Name = msg.Name;
oldMsg.Type = msg.Type;
}
}).Verifiable();
и тестируемый метод:
public void SaveMessage(Message message)
{
var windowsIdentity = WindowsIdentity.GetCurrent();
message.ModifiedBy = windowsIdentity != null ?
windowsIdentity.Name :
string.Empty;
message.ModifyDate = DateTime.Now;
Messaging.Entry(message).State = EntityState.Modified;
Messaging.SaveChanges();
}
Если логика обновления элемента выполнена в Moq, то я просто тестирую тест. Как я могу проверить бизнес-логику функциональности обновления?
1 ответ
На мой взгляд, нет прямого ответа на ваш вопрос.
Ваша проблема в том, что ваш класс сообщений нарушает принцип синусоидальной ответственности - либо выполняя несколько действий одновременно (выполнение проверок, сохранение в базе данных,...) в одном классе, либо путем тесной связи.
Модульное тестирование плохо работает с таким кодом. Чтобы иметь возможность модульного тестирования вашего метода сохранения, вам нужно будет извлечь все аспекты в отдельные блоки (например, классы), а затем протестировать их по отдельности.
Таким образом, вы получите один класс для проверки, один класс для фактического сохранения, ваш объект домена и так далее. Эти классы затем объединяются, чтобы сформировать все это.
Теперь вы можете протестировать каждый из этих классов по отдельности и, вероятно, обнаружите, что единственное, что вам нужно сделать, - это сам процесс написания.