Ho una classe che è refactored in 1 classe principale e in 2 classi più piccole. Le classi principali usano il database (come fanno molte mie classi) e inviano un'email.
Quindi la classe principale ha una IPersonRepository
e una IEmailRepository
iniettata che a sua volta invia alle 2 classi più piccole.
Ora voglio testare l'unità principale della classe principale, e ho imparato a non smantellare il funzionamento interno della classe, perché dovremmo essere in grado di cambiare il funzionamento interno senza interrompere i test unitari.
Tuttavia, poiché la classe utilizza IPersonRepository
e IEmailRepository
, I HAVE specifica i risultati (mock / dummy) per alcuni metodi per IPersonRepository
. La classe principale calcola alcuni dati in base ai dati esistenti e li restituisce. Se voglio testarlo, non vedo come posso scrivere un test senza specificare che IPersonRepository.GetSavingsByCustomerId
restituisce x. Ma poi il mio test unitario "conosce" il funzionamento interno, perché "conosce" i metodi per deridere e quali no.
Come posso testare una classe che ha inserito le dipendenze, senza che il test sia a conoscenza degli interni?
sfondo:
Nella mia esperienza molti test come questo creano dei mock per i repository e poi forniscono i dati giusti per i mock o testano se un metodo specifico è stato chiamato durante l'esecuzione. Ad ogni modo, il test conosce gli interni.
Ora ho visto una presentazione sulla teoria (che ho sentito prima) che il test non dovrebbe conoscere l'implementazione. Innanzitutto perché non stai testando come funziona , ma anche perché quando cambi l'implementazione tutti i test delle unità falliscono perché "sanno" dell'implementazione. Sebbene mi piaccia l'idea che i test non siano a conoscenza dell'implementazione, non so come realizzarlo.