per quanto ne capisco, la maggior parte delle persone sembra concordare sul fatto che i metodi privati non dovrebbero essere testati direttamente, ma piuttosto attraverso qualunque metodo pubblico li chiama. Vedo il loro punto, ma ho qualche problema con questo quando provo a seguire le "Tre Leggi del TDD" e uso il ciclo "Rosso - verde - Rifattore". Penso che sia meglio spiegato da un esempio:
In questo momento, ho bisogno di un programma in grado di leggere un file (contenente dati separati da tabulazioni) e filtrare tutte le colonne che contengono dati non numerici. Immagino che probabilmente ci siano già alcuni semplici strumenti disponibili per farlo, ma ho deciso di implementarlo da zero, soprattutto perché ho pensato che potesse essere un progetto bello e pulito per me fare un po 'di pratica con TDD.
Quindi, per prima cosa, "metto il cappello rosso", cioè ho bisogno di un test che fallisca. Ho pensato, avrò bisogno di un metodo che trovi tutti i campi non numerici in una linea. Quindi scrivo un semplice test, ovviamente non riesce a compilare immediatamente, quindi inizio a scrivere la funzione stessa e dopo un paio di cicli avanti e indietro (rosso / verde) ho una funzione operativa e un test completo.
Successivamente, continuo con una funzione, "gatherNonNumericColumns" che legge il file, una riga alla volta, e chiama la mia funzione "findNonNumericFields" su ciascuna riga per raccogliere tutte le colonne che alla fine devono essere rimosse. Un paio di cicli rosso-verde, e ho finito, avendo di nuovo, una funzione di lavoro e un test completo.
Ora, immagino che dovrei refactoring. Poiché il mio metodo "findNonNumericFields" è stato progettato solo perché ho pensato che ne avrei avuto bisogno durante l'implementazione di "gatherNonNumericColumns", mi sembra ragionevole lasciare che "findNonNumericFields" diventi privato. Tuttavia, ciò interromperebbe i miei primi test, poiché non avrebbero più accesso al metodo che stavano testando.
Quindi, finisco con un metodo privato e una suite di test che lo prova. Dato che così tante persone consigliano che i metodi privati non dovrebbero essere testati, mi sento come se mi fossi dipinto in un angolo qui. Ma dove ho fallito esattamente?
Ho capito che avrei potuto iniziare a un livello più alto, scrivendo un test che mette alla prova quello che alla fine diventerà il mio metodo pubblico (cioè findAndFilterOutAllNonNumericalColumns), ma questo sembra in qualche modo in contrasto con l'intero punto del TDD (almeno secondo lo zio Bob) : Che dovresti passare costantemente tra i test di scrittura e il codice di produzione e che in qualsiasi momento, tutti i tuoi test hanno funzionato nell'ultimo minuto circa. Perché se inizio scrivendo un test per un metodo pubblico, ci saranno diversi minuti (o ore o addirittura giorni in casi molto complessi) prima che ottenga tutti i dettagli nei metodi privati per funzionare in modo che il test collauda il pubblico il metodo passa.
Quindi che si fa? TDD (con il rapido ciclo rosso-verde del refattore) non è semplicemente compatibile con i metodi privati? O c'è un difetto nel mio design?
private
se avesse senso farlo.