Przed udzieleniem odpowiedzi na takie pytanie musisz zdecydować, co naprawdę chcesz osiągnąć.
Piszesz kod. Masz nadzieję, że spełni swój kontrakt (innymi słowy, zrobi to, co powinien. Zapisanie tego, co ma zrobić, jest dla niektórych ogromnym krokiem naprzód).
Aby mieć uzasadnione przekonanie, że kod robi to, co powinien, albo wpatrujesz się w niego wystarczająco długo, albo piszesz kod testowy, który testuje wystarczającą liczbę przypadków, aby cię przekonać „jeśli kod przejdzie wszystkie te testy, to jest poprawny”.
Często interesuje Cię tylko publicznie zdefiniowany interfejs jakiegoś kodu. Jeśli używam biblioteki, nie obchodzi mnie, jak to działa poprawnie wykonana, tylko że nie działa poprawnie. Weryfikuję poprawność Twojej biblioteki, przeprowadzając testy jednostkowe.
Ale tworzysz bibliotekę. Prawidłowe działanie może być trudne. Powiedzmy, że dbam tylko o to, aby biblioteka poprawnie wykonywała operację X, więc mam test jednostkowy dla X. Ty, twórca odpowiedzialny za utworzenie biblioteki, wdrażasz X, łącząc kroki A, B i C, z których każdy jest zupełnie nietrywialny. Aby biblioteka działała, dodajesz testy, aby sprawdzić, czy A, B i C działają poprawnie. Chcesz te testy. Mówienie „nie powinieneś mieć testów jednostkowych dla metod prywatnych” jest zupełnie bezcelowe. Ci chcą testy dla tych metod prywatnych. Może ktoś mówi ci, że testowanie metod prywatnych jest niepoprawne. Ale to oznacza tylko, że możesz nie nazwać ich „testami jednostkowymi”, ale „testami prywatnymi” lub jakkolwiek chcesz je nazwać.
Język Swift rozwiązuje problem polegający na tym, że nie chcesz ujawniać A, B, C jako metod publicznych tylko dlatego, że chcesz go przetestować, nadając funkcjom atrybut „testowalny”. Kompilator umożliwia wywoływanie prywatnych metod testowych z testów jednostkowych, ale nie z kodu nie testowego.