Модульные тесты и тестирование теста

Мое приложение имеет возможность обновить элемент. Я хотел бы создать модульный тест для этого.

Это в 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 ответ

На мой взгляд, нет прямого ответа на ваш вопрос.

Ваша проблема в том, что ваш класс сообщений нарушает принцип синусоидальной ответственности - либо выполняя несколько действий одновременно (выполнение проверок, сохранение в базе данных,...) в одном классе, либо путем тесной связи.

Модульное тестирование плохо работает с таким кодом. Чтобы иметь возможность модульного тестирования вашего метода сохранения, вам нужно будет извлечь все аспекты в отдельные блоки (например, классы), а затем протестировать их по отдельности.

Таким образом, вы получите один класс для проверки, один класс для фактического сохранения, ваш объект домена и так далее. Эти классы затем объединяются, чтобы сформировать все это.

Теперь вы можете протестировать каждый из этих классов по отдельности и, вероятно, обнаружите, что единственное, что вам нужно сделать, - это сам процесс написания.

Другие вопросы по тегам