Non E il tuo esempio è perfetto per mostrare perché no.
Vuoi inviare e-mail, vero? Quindi crei da qualche parte una classe statica CommunicationUtilities
con al suo interno una statica SendEmail()
. Si utilizza questo metodo da una classe che fa un sacco di cose, ad esempio reimposta la password di un utente e gli invia una nuova via e-mail. Perfetto.
Ora, cosa succede se vuoi testare l'unità della tua classe? Non puoi, perché ogni volta che vuoi testare il metodo che reimposta la password, cambia il database (che non è adatto per un test unitario) e inoltre invia un'e-mail (che è anche peggio).
Potresti aver letto di Inversion of Control, che ha il vantaggio di semplificare i test unitari. Gli articoli su IoC spiegheranno che invece di fare qualcosa del tipo:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
tu fai:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
che permette di usare beffe e tronconi.
Prova ad applicare IoC al tuo CommunicationUtilities
. Giusto, non puoi. Ecco perché è rotto.