o ile rozumiem, większość ludzi zgadza się, że prywatne metody nie powinny być testowane bezpośrednio, ale raczej za pomocą jakichkolwiek publicznych metod, które je nazywają. Rozumiem ich punkt widzenia, ale mam z tym pewne problemy, gdy próbuję postępować zgodnie z „Trzema prawami TDD” i stosować cykl „Czerwony - zielony - refaktor”. Myślę, że najlepiej to wyjaśnić przykładem:
W tej chwili potrzebuję programu, który może odczytać plik (zawierający dane rozdzielone tabulatorami) i odfiltrować wszystkie kolumny zawierające dane nienumeryczne. Sądzę, że prawdopodobnie są już dostępne proste narzędzia, ale sam zdecydowałem się na wdrożenie od podstaw, głównie dlatego, że pomyślałem, że może to być fajny i czysty projekt, aby uzyskać trochę praktyki z TDD.
Po pierwsze „zakładam czerwony kapelusz”, czyli potrzebuję testu, który się nie powiedzie. Pomyślałem, że potrzebuję metody, która znajdzie wszystkie pola nienumeryczne w linii. Więc piszę prosty test, oczywiście, że nie kompiluje się od razu, więc zaczynam pisać samą funkcję, a po kilku cyklach tam iz powrotem (czerwony / zielony) mam działającą funkcję i kompletny test.
Następnie kontynuuję funkcję „gatherNonNumericColumns”, która odczytuje plik, jeden wiersz na raz, i wywołuje moją funkcję „findNonNumericFields” w każdym wierszu, aby zebrać wszystkie kolumny, które ostatecznie muszą zostać usunięte. Kilka cykli czerwono-zielonych, i skończyłem, mając ponownie działającą funkcję i pełny test.
Teraz myślę, że powinienem dokonać refaktoryzacji. Ponieważ moja metoda „findNonNumericFields” została zaprojektowana tylko dlatego, że doszedłem do wniosku, że będę jej potrzebować podczas implementowania „gatherNonNumericColumns”, wydaje mi się, że rozsądne byłoby pozostawienie „findNonNumericFields” prywatnemu. To jednak przerwałoby moje pierwsze testy, ponieważ nie miałyby one już dostępu do metody, którą testowały.
W rezultacie otrzymuję prywatne metody i zestaw testów, które to sprawdzają. Ponieważ tak wiele osób doradza, że nie należy testować prywatnych metod, wydaje mi się, że zamalowałem się tutaj w kącie. Ale gdzie dokładnie zawiodłem?
Rozumiem, że mogłem zacząć na wyższym poziomie, pisząc test, który testuje, co ostatecznie stanie się moją publiczną metodą (to znaczy findAndFilterOutAllNonNumericalColumns), ale wydaje mi się to sprzeczne z całym punktem TDD (przynajmniej według wuja Boba) : Należy stale przełączać się między pisaniem testów a kodem produkcyjnym oraz, że w dowolnym momencie wszystkie testy zadziałały w ciągu ostatniej minuty. Ponieważ jeśli zacznę od napisania testu dla metody publicznej, minie kilka minut (lub godzin, a nawet dni w bardzo skomplikowanych przypadkach), zanim uzyskam wszystkie szczegóły w metodach prywatnych, aby test mógł przetestować metodę publiczną metoda mija.
Co więc robić? Czy TDD (z szybkim cyklem refaktoryzacji czerwony-zielony) po prostu nie jest zgodny z metodami prywatnymi? Czy jest to błąd w moim projekcie?
private
jakby miało to sens.