Вы не И ваш собственный пример является идеальным, чтобы показать, почему нет.
Вы хотите отправлять электронные письма, верно? Таким образом, вы создаете где-то статический класс CommunicationUtilities
со статическим SendEmail()
в нем. Вы используете этот метод из некоторого класса, который делает кучу вещей, например, сбрасывает пароль пользователя и отправляет ему новый по электронной почте. Отлично.
Что произойдет, если вы захотите провести юнит-тестирование своего класса? Вы не можете, потому что каждый раз, когда вы хотите проверить метод, который сбрасывает пароль, он изменяет базу данных (которая не подходит для модульного теста) и, кроме того, отправляет электронное письмо (что еще хуже).
Возможно, вы читали об Inversion of Control, которая имеет преимущество, облегчая модульное тестирование. Статьи о IoC объяснят вам, что вместо того, чтобы делать что-то вроде:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
ты сделаешь:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
что позволяет использовать издевательства и заглушки.
Попробуйте применить IoC к вашему CommunicationUtilities
. Точно, ты не можешь. Вот почему это сломано.