Myślę, że bardziej fundamentalnym pytaniem powinno być to, dlaczego próbujesz w pierwszej kolejności przetestować metodę prywatną. Jest to zapach kodu, który próbujesz przetestować metodę prywatną za pomocą publicznego interfejsu tej klasy, podczas gdy ta metoda jest prywatna z jakiegoś powodu, ponieważ jest szczegółem implementacji. Należy się tylko przejmować zachowaniem interfejsu publicznego, a nie jego implementacją pod przykryciem.
Jeśli chcę przetestować zachowanie metody prywatnej, używając wspólnych refaktoryzacji, mogę wyodrębnić jej kod do innej klasy (być może z widocznością na poziomie pakietu, więc upewnij się, że nie jest to część publicznego API). Następnie mogę przetestować jego zachowanie w izolacji.
Produkt refaktoryzacji oznacza, że metoda prywatna jest teraz oddzielną klasą, która stała się współpracownikiem oryginalnej klasy. Jego zachowanie zostanie dobrze poznane dzięki własnym testom jednostkowym.
Następnie mogę kpić z jego zachowania, gdy próbuję przetestować oryginalną klasę, dzięki czemu mogę skoncentrować się na przetestowaniu zachowania publicznego interfejsu tej klasy, zamiast testować kombinatoryczną eksplozję publicznego interfejsu i zachowanie wszystkich jego prywatnych metod .
Widzę to analogicznie do prowadzenia samochodu. Kiedy prowadzę samochód, nie jeżdżę z podniesioną maską, więc widzę, że silnik działa. Polegam na interfejsie, który zapewnia samochód, a mianowicie na obrotomierzu i prędkościomierzu, aby wiedzieć, że silnik działa. Polegam na tym, że samochód faktycznie porusza się po naciśnięciu pedału gazu. Jeśli chcę przetestować silnik, mogę to sprawdzić osobno. :RE
Oczywiście bezpośrednie testowanie metod prywatnych może być ostatecznością, jeśli masz starszą aplikację, ale wolałbym, aby starszy kod został ponownie przekształcony, aby umożliwić lepsze testowanie. Michael Feathers napisał świetną książkę na ten właśnie temat. http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052
pre-historic
jeśli chodzi o lata internetowe, ale testowanie jednostkowe metod prywatnych jest teraz zarówno łatwe, jak i bezpośrednie, a Visual Studio produkuje w razie potrzeby niezbędne klasy akcesoriów. wstępne wypełnianie logiki testów fragmentami cholernie zbliżonymi do tego, czego można chcieć od prostych testów funkcjonalnych. Zobacz np. msdn.microsoft.com/en-us/library/ms184807%28VS.90%29.aspx