Se intendi il privato nel modo in cui penso tu intenda, allora no - non dovresti essere un'unità di testarlo. Dovresti essere solo unità test di comportamento osservabile / stato. Potrebbe mancare il punto dietro il ciclo "red-green-refactor" di TDD (e se non stai facendo il test prima, si applica lo stesso principio). Una volta che i test sono stati scritti e passati, non vuoi che cambino durante l'esecuzione del refactoring. Se sei costretto a testare l'unità funzionalità privata allora probabilmente significa che i test unitari intorno 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, col passare del tempo i tuoi test unitari diventeranno una palla al piede che ti rallenta senza aggiungere alcun valore (cambiare l'implementazione, ad esempio l'ottimizzazione o la rimozione della duplicazione, non dovrebbe avere alcun effetto sui test delle unità). Il codice interno dovrebbe, tuttavia, essere testato unitamente in quanto il comportamento / stato è osservabile (solo in modo limitato).
Quando ho effettuato per la prima volta i test unitari ho tirato ogni sorta di trucchetti per le prove private unitarie, ma ora, con qualche anno di vita, vedo che è peggio di una perdita di tempo.
Ecco un esempio un po 'sciocco, ovviamente nella vita reale ci sarebbero più test di questi:
Supponiamo che tu abbia una classe che restituisce una lista ordinata di stringhe: dovresti controllare che il risultato sia ordinato, non come lo elenchi effettivamente. Potresti iniziare la tua implementazione con un singolo algoritmo che ordina solo la lista. Una volta fatto, il test non deve essere modificato se si modifica l'algoritmo di ordinamento. A questo punto hai un solo test (supponendo che l'ordinamento sia incorporato nella tua classe):
- Il mio risultato è ordinato?
Ora dì che vuoi due algoritmi (forse uno è più efficiente in alcune circostanze ma non in altri), quindi ogni algoritmo potrebbe (e generalmente dovrebbe) essere fornito da una classe diversa e le scelte di classe da loro - puoi controllare questo sta accadendo per i tuoi scenari scelti usando i mock, ma il tuo test originale è ancora valido e poiché stiamo verificando solo il comportamento osservabile / stato non ha bisogno di cambiare. Finisci con 3 test:
- Il mio risultato è ordinato?
- Dato uno scenario (diciamo che l'elenco iniziale è quasi ordinato per iniziare) è una chiamata fatta alla classe che ordina le stringhe usando l'algoritmo X?
- Dato uno scenario (la lista iniziale è in ordine casuale) è una chiamata alla classe che ordina le stringhe usando l'algoritmo Y?
L'alternativa sarebbe stata iniziare a testare il codice privato all'interno della tua classe - non ottieni nulla da questo - i test sopra riportati mi dicono tutto quello che devo sapere per quanto riguarda il test unitario. Aggiungendo test privati ti stai costruendo una giacca diritta, quanto più lavoro sarebbe se non solo verificassi che il risultato fosse ordinato ma anche come è ordinato?
I test (di questo tipo) dovrebbero cambiare solo quando il comportamento cambia, iniziare a scrivere test sul codice privato e quello esce dalla finestra.