Voglio testare un metodo che non è tanto un'unità, perché è più una classe di 'orchestrator' / 'process' / 'controller' / 'coordination'.
Questo è il caso:
Ho quattro classi testate da unità:
- Uno è un servizio dati che può leggere / scrivere dati dal database
- Il secondo è un servizio di scrittura che può creare contenuti per email / messaggi ecc.
- Terzo è un servizio di posta che può inviare email
- Quarto è un dat di classe in grado di creare compiti per gli utenti nel nostro sistema (le attività sono cose dovrebbero fare)
Ora ho creato una nuova classe, che invia un'email a tutte le persone in ritardo con il pagamento di una fattura. Legge i dati con il servizio dati, crea il testo appropriato con il servizio SMS, invia un'e-mail con il servizio di posta elettronica, scrive il nuovo stato della fattura con il servizio dati e crea un'attività quando l'e-mail per una specifica fattura non riesce.
Ora questa nuova classe è la mia classe "orchestrator" o "process" o "controller" o "coordination".
Ho questo tipo di classi molto nella nostra applicazione perché cerchiamo di rendere le nostre classi (come i dati / email / SMSservice) il più piccole possibile così quando 'il lavoro deve essere fatto', come in questo caso il ' invia tutte le persone in ritardo con il pagamento ", creiamo una nuova classe" orchestrator "o" process "o" controller "o" coordination ".
Penso di avere questo tipo di classi per la maggior parte delle mie azioni nei miei webcontrollers perché la maggior parte degli input inviati dal browser implica il coordinamento tra più classi (più piccole)
Ora come faccio a testare queste classi / metodi?
Ero solito prendere in giro tutte e 4 le classi nel mio test e verificare alla fine che le classi vengano chiamate e nel giusto ordine.
Ma sempre più leggo che non lo fai, perché poi provi per il funzionamento interno di un metodo, e quando rifattori quel metodo, il test fallisce. Quindi dovrei testare i risultati, non il lavoro interiore. Ma questo metodo è nullo, quindi non ci sono molti risultati da verificare. L'unica cosa che posso pensare ad esempio per verificare è: viene inviata una e-mail? Ma l'unico modo per verificare che è verificare il servizio di posta elettronica è chiamato, ma poi sono tornato a testare la parte interna.
Non vedo questo tipo di esempi nel test delle unità / libri tdd, perché la maggior parte delle volte funzionano solo con classi piccole come la classe calcolatrice, ma raramente vedo esempi per "orchestrator" classi come sto descrivendo, ma che si verificano molto nel mio codice.
Per coloro che pensano che sia un duplicato: penso che le risposte qui forniscano molto più background rispetto all'unica risposta all'altra domanda. A quell'altra domanda è stata data una risposta con un test di integrazione, e la mia domanda riguarda il test unitario, non i test di integrazione. Quindi non posso essere d'accordo con il segno di risposta doppio.