Sto iniziando con i test delle unità e sto provando a fare qualche TDD. Ho letto un bel po 'sull'argomento e ho scritto alcuni test. Voglio solo sapere se il seguente è l'approccio giusto.Come si deve testare l'invio di e-mail da un controller?
Desidero aggiungere la solita funzione "contattaci" sul mio sito web. Sai qual è la cosa, l'utente compila un modulo con il loro indirizzo email, inserisce un breve messaggio e preme un pulsante per inviare il modulo indietro.
I raccoglitori modello fanno le loro cose e il mio metodo di azione accetta i dati inviati come modello. Il metodo di azione analizzerebbe quindi il modello e userà smtp per inviare una e-mail all'amministratore del sito web che lo informa che qualcuno ha compilato il modulo di contatto sul proprio sito.
Ora per la domanda .... Per testare questo, dovrei essere proprio la creazione di un'interfaccia IMessageService che ha un metodo Invia (emailAddress, messaggio) per accettare l'indirizzo email e il corpo del messaggio. Implementa l'intefaccia in una classe concreta e lascia che quella classe si occupi di smtp e in realtà invii la posta.
Se aggiungo l'interfaccia come parametro al costruttore del controller, posso utilizzare DI e IoC per iniettare la classe concreta nel controller. Ma quando collaudo unità posso creare una versione falsa o finta del mio IMessageService e fare asserzioni su quello.
La ragione per cui chiedo è che ho visto altri esempi di persone che generano interfacce per SmtpClient e che poi lo prendono in giro. C'è davvero bisogno di andare così lontano o non capisco questa roba?
Sono d'accordo, e sarà probabilmente utile non appena avrai bisogno di IMailClientAsync che puoi scambiare. – Hal