Attualmente sto preparando le basi per un'applicazione ASP.Net MVC e sto esaminando quale tipo di unit test dovrei essere pronto a scrivere. Ho visto in più punti la gente essenzialmente dicendo "non preoccuparti di testare le tue opinioni, non c'è logica ed è banale e sarà coperto da un test di integrazione".
Non capisco come questa sia diventata la saggezza accettata. I test di integrazione hanno uno scopo completamente diverso rispetto ai test unitari. Se rompo qualcosa, non voglio sapere mezz'ora dopo quando i miei test di integrazione si interrompono, voglio sapere immediatamente.
Scenario di esempio: supponiamo di avere a che fare con un'app CRUD standard con un'entità cliente. Il cliente ha un nome e un indirizzo. A ogni livello di test, desidero verificare che la logica di recupero del cliente ottenga correttamente il nome e l'indirizzo.
Per testare l'unità sul repository, scrivo un test di integrazione per colpire il database. Per testare le regole aziendali, derido il repository, fornisco i dati appropriati delle regole aziendali e verifico che i risultati previsti vengano restituiti.
Cosa mi piacerebbe fare: per testare l'unità dell'interfaccia utente, derido le regole aziendali, configuro l'istanza del cliente prevista, eseguo il rendering della vista e verifico che la vista contenga i valori appropriati per l'istanza specificata.
Cosa sono bloccato a fare: Per testare l'unità nel repository, scrivo un test di integrazione, configuro un login appropriato, creo i dati richiesti nel database, apro un browser, navigo verso il cliente e verifico che la pagina risultante contenga la valori per l'istanza che ho specificato.
Mi rendo conto che c'è una sovrapposizione tra i due scenari discussi sopra, ma la differenza fondamentale è il tempo e lo sforzo necessari per impostare ed eseguire i test.
Se io (o un altro sviluppatore) rimuovo il campo dell'indirizzo dalla vista, non voglio aspettare che il test di integrazione lo scopra. Voglio essere scoperto e contrassegnato in un unit test che viene eseguito più volte al giorno.
Ho la sensazione che non stia solo afferrando qualche concetto chiave. Qualcuno può spiegare perché volere un riscontro immediato del test sulla validità di una vista MVC è una cosa negativa? (o, se non male, non è il modo previsto per ottenere un feedback)
"To unit-test the repository, I write an integration test"
Aspetta cosa? Questo non è un test unitario del repository. Stai automatizzando il test, ma il codice sotto test include ancora il DAL e il database. Per testare l'unità il repository è necessario isolarlo come per le regole aziendali.