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