Jeśli masz na myśli prywatność tak, jak myślę, masz na myśli, to nie - nie powinieneś testować tego jednostkowo. Powinieneś testować tylko jednostki możliwe do zaobserwowania zachowanie / stan. Być może brakuje Ci punktu za cyklem „refrakcji czerwono-zielonej” TDD (a jeśli nie przeprowadzasz testu najpierw, obowiązuje ta sama zasada). Po napisaniu i zdaniu testów nie chcesz, aby się zmieniały podczas refaktoryzacji. Jeśli jesteś zmuszony do testowania jednostkowego funkcjonalności prywatnych, prawdopodobnie oznacza to, że testy jednostkowe wokół funkcjonalności publicznej są wadliwe. Jeśli pisanie testów wokół kodu publicznego jest trudne i skomplikowane, być może twoja klasa robi za dużo lub twój problem nie jest jasno określony.
Co gorsza, z czasem twoje testy jednostkowe staną się kulą i łańcuchem spowalniając cię bez dodawania jakiejkolwiek wartości (zmiana implementacji, na przykład optymalizacja lub usunięcie duplikacji, nie powinna mieć wpływu na testy jednostkowe). Kod wewnętrzny powinien jednak być testowany jednostkowo, ponieważ zachowanie / stan jest obserwowalny (tylko w ograniczony sposób).
Kiedy po raz pierwszy przeprowadziłem testy jednostkowe, podciągnąłem różne sztuczki, aby przetestować prywatne rzeczy, ale teraz, mając kilka lat za sobą, uważam to za gorsze niż strata czasu.
Oto trochę głupi przykład, oczywiście w prawdziwym życiu miałbyś więcej testów niż te:
Załóżmy, że masz klasę, która zwraca posortowaną listę ciągów - powinieneś sprawdzić, czy wynik jest posortowany, a nie jak to faktycznie sortuje tę listę. Możesz rozpocząć wdrażanie za pomocą jednego algorytmu, który po prostu sortuje listę. Po zakończeniu test nie musi się zmieniać, jeśli zmienisz algorytm sortowania. W tym momencie masz jeden test (zakładając, że sortowanie jest osadzone w twojej klasie):
- Czy mój wynik jest posortowany?
Powiedzmy teraz, że chcesz dwóch algorytmów (być może jeden jest bardziej wydajny w niektórych okolicznościach, ale nie w innych), a następnie każdy algorytm może (i ogólnie powinien) być dostarczony przez inną klasę, a twoja klasa wybiera z nich - możesz sprawdzić, czy to się dzieje wybrane przez Ciebie scenariusze wykorzystujące symulacje, ale oryginalny test jest nadal ważny, a ponieważ weryfikujemy jedynie możliwe do zaobserwowania zachowanie / stan, nie trzeba go zmieniać. Kończysz 3 testy:
- Czy mój wynik jest posortowany?
- Biorąc pod uwagę scenariusz (powiedzmy, że początkowa lista jest prawie posortowana na początek), czy jest wywołanie do klasy, która sortuje łańcuchy przy użyciu algorytmu X?
- Biorąc pod uwagę scenariusz (początkowa lista jest w losowej kolejności), czy wywołano klasę, która sortuje łańcuchy przy użyciu algorytmu Y?
Alternatywą byłoby rozpoczęcie testowania prywatnego kodu w twojej klasie - nic z tego nie zyskujesz - powyższe testy mówią mi wszystko, co muszę wiedzieć, jeśli chodzi o testy jednostkowe. Dodając testy prywatne, budujesz sobie prostą kurtkę, o ile więcej pracy byś zrobił, gdybyś nie tylko sprawdził, że wynik został posortowany, ale także jak został posortowany?
Testy (tego typu) powinny się zmieniać tylko wtedy, gdy zmienia się zachowanie, rozpocząć pisanie testów na prywatnym kodzie i to wychodzi poza okno.