Usted no Y su propio ejemplo es perfecto para mostrar por qué no.
¿Quieres enviar correos electrónicos, verdad? Entonces creas en algún lugar una clase estática CommunicationUtilities
con una estática SendEmail()
. Utiliza este método de alguna clase que hace un montón de cosas, por ejemplo, restablece la contraseña de un usuario y le envía una nueva por correo electrónico. Perfecto.
Ahora, ¿qué pasa si quieres probar tu clase en una unidad? No puede, porque cada vez que desea probar el método que restablece la contraseña, cambia la base de datos (que no es adecuada para una prueba unitaria) y, además, envía un correo electrónico (que es aún peor).
Es posible que haya leído sobre Inversión de control, que tiene la ventaja de facilitar las pruebas unitarias. Los artículos sobre IoC le explicarán que en lugar de hacer algo como:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
tú lo haces:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
que permite usar simulacros y trozos.
Intenta aplicar IoC a tu CommunicationUtilities
. Bien, no puedes. Por eso está roto.