Se intendi privato nel modo in cui penso che lo intendi, allora no - non dovresti provare l'unità. Dovresti essere solo test unit comportamento / stato osservabile. Potrebbe mancare il punto dietro il ciclo "refactor rosso-verde" di TDD (e se non si esegue prima il test, si applica lo stesso principio). Una volta che i test sono stati scritti e superati, non si desidera che cambino durante l'esecuzione del refactoring. Se sei costretto a testare le funzionalità private dell'unità, probabilmente significa che i test delle unità attorno alla funzionalità pubblica sono difettosi. Se è difficile e complesso scrivere test attorno al codice pubblico, forse la tua classe sta facendo troppo o il tuo problema non è chiaramente definito.
Peggio ancora, nel tempo i tuoi test unitari diventeranno una palla al piede che ti rallenta senza aggiungere alcun valore (la modifica dell'implementazione, ad esempio l'ottimizzazione o la rimozione della duplicazione, non dovrebbe avere alcun effetto sui test unitari). Tuttavia, il codice interno dovrebbe essere testato in unità poiché il comportamento / stato è osservabile (solo in modo limitato).
Quando ho fatto i test unitari per la prima volta, ho tirato tutti i tipi di trucchi per testare le unità private ma ora, con alcuni anni alle spalle, lo vedo peggio di una perdita di tempo.
Ecco un esempio un po 'sciocco, ovviamente nella vita reale avresti più test di questi:
Supponiamo che tu abbia una classe che restituisce un elenco ordinato di stringhe: dovresti verificare che il risultato sia ordinato, non come ordinarlo effettivamente. È possibile avviare l'implementazione con un singolo algoritmo che ordina semplicemente l'elenco. Una volta fatto, il test non deve cambiare se si modifica l'algoritmo di ordinamento. A questo punto hai un singolo test (supponendo che l'ordinamento sia incorporato nella tua classe):
- Il mio risultato è ordinato?
Ora supponiamo che tu voglia due algoritmi (forse uno è più efficiente in alcune circostanze ma non altri), quindi ogni algoritmo potrebbe (e in generale, dovrebbe) essere fornito da una classe diversa e la tua classe sceglierà da loro - puoi verificare che ciò avvenga per i tuoi scenari scelti usando simulazioni, ma il tuo test originale è ancora valido e poiché stiamo verificando solo comportamenti / stati osservabili, non è necessario cambiare. Si finisce con 3 test:
- Il mio risultato è ordinato?
- Dato uno scenario (diciamo che l'elenco iniziale è quasi ordinato per cominciare) viene fatta una chiamata alla classe che ordina le stringhe usando l'algoritmo X?
- Dato uno scenario (l'elenco iniziale è in ordine casuale) viene effettuata una chiamata alla classe che ordina le stringhe usando l'algoritmo Y?
L'alternativa sarebbe stata quella di iniziare a testare il codice privato all'interno della tua classe - non ottieni nulla da questo - i test di cui sopra mi dicono tutto ciò che devo sapere per quanto riguarda i test unitari. Aggiungendo test privati ti stai costruendo una giacca dritta, quanto più lavoro sarebbe se non solo controllassi che il risultato fosse ordinato, ma anche come fosse ordinato?
I test (di questo tipo) dovrebbero cambiare solo quando cambia il comportamento, iniziare a scrivere test contro il codice privato e questo esce dalla finestra.