Il frammento di codice che hai mostrato è un eccellente test unitario , a condizione che l'unità sotto test sia un combinatore di parti astratte e che non abbia una responsabilità più concreta all'interno del dominio problematico dell'applicazione.
Ad esempio, supponiamo che il punto effettivo di questo pezzo di codice sia quello di calcolare un tasso di interesse. Come dettaglio di implementazione, questo calcolo è stato diviso in due parti. Un test che non riguarda i tassi di interesse è quindi un test inutile. Il test mostrato passerebbe indipendentemente dal fatto che il calcolo sia corretto. Non garantisce che il sistema si comporti come previsto, ma asserisce che il sistema è implementato in un modo particolare. In generale, tali test non sono una buona idea. Sono fragili e si romperanno ogni volta che il sistema verrà refactored. Il post del blog ha ragione nell'affermare che tali test possono causare più lavoro di quanto valga.
Tuttavia, il codice viene presentato senza contesto e potrebbe essere l'intero punto di quel codice per combinare in sequenza tali processori. Tale codice potrebbe far parte di una libreria di motori di regole astratte o, più in generale, come parte di un Pattern composito. È quindi assolutamente corretto verificare che i due processori siano stati richiamati e richiamati nell'ordine corretto. Ho scritto questo codice e ho scritto tali test senza una cattiva coscienza.
Per questo test è del tutto ragionevole utilizzare oggetti finti, poiché il comportamento concreto delle parti del processore è al di fuori dell'ambito dell'unità sottoposta a test. Secondo il libro Quality Code di Stephen Vance: "Un unit test è un test che verifica il valore aggiunto dal codice sotto test. Qualsiasi utilizzo di collaboratori testabili indipendentemente è semplicemente una questione di convenienza "(Vance 2013, p 26). Qui, il valore aggiunto dal codice combina due processori in uno. È quindi sufficiente verificare ciò che fa questo codice (concatenando due sub-processori), e non è necessario testare ciò che fanno questi collaboratori (ad esempio che i sub-processori eseguono un calcolo del tasso di interesse corretto). Tali test sono anche utili, ma sarebbero test di integrazione.
Quindi, in entrambi i casi, la domanda da porre è: qual è il punto di questo codice, perché esiste? Cosa rappresenta questa astrazione? Quale interfaccia offre ai chiamanti? Quale comportamento è documentato? Quindi prova il suo comportamento e non il meccanismo attraverso il quale è implementato.