Допустим, у меня есть следующая функция, которую я хочу проверить:
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
_emailService.SendEmail(order.User.Email, "Your order has been cancelled!");
}
Теперь класс Order является сгенерированным SubSonic-классом, и свойство User в нем загружается с отложенной загрузкой, что означает, что когда я вызываю order.User.Email, он фактически выполняет оператор SQL для извлечения пользователя.
Если бы я хотел провести модульное тестирование, у меня были бы проблемы, потому что я действительно не хотел, чтобы мой модульный тест попадал в мою базу данных.
Мое текущее решение состоит в том, чтобы реорганизовать функцию CancelOrder, чтобы она выглядела следующим образом:
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
User user = _userRepository.GetByUserID(order.UserID);
_emailService.SendEmail(user.Email, "Your order has been cancelled!");
}
Затем я могу заглушить вызов _userRepository.GetUserByID (), чтобы вернуть жестко закодированный объект User.
Это лучший способ сделать это? Полагаю, можно утверждать, что вторая реализация более чистая, поскольку весь доступ к данным осуществляется через репозиторий, а не скрыт в свойствах.