Перш ніж відповісти на таке запитання, потрібно визначитися, чого ви насправді хочете досягти.
Ви пишете код. Ви сподіваєтесь, що він виконає свій контракт (іншими словами, він робить те, що повинен робити. Списання того, що він повинен зробити, - це гігантський крок вперед для деяких людей).
Щоб бути впевненим, що код робить те, що він повинен робити, ви або довго придивляєтесь до нього, або ви пишете тестовий код, який перевіряє достатньо випадків, щоб переконати вас, "якщо код здає всі ці тести, то це правильно".
Часто вас цікавить лише публічно визначений інтерфейс якогось коду. Якщо я використовую свою бібліотеку, я не хвилює , як ви зробили це правильно працювати, тільки те , що він робить роботу правильно. Я перевіряю правильність вашої бібліотеки, виконуючи тести на одиниці.
Але ви створюєте бібліотеку. Налагодити його правильну роботу може бути важко досягти. Скажімо, я хвилююсь лише того, щоб бібліотека виконувала операцію X правильно, тому у мене є тестовий блок для X. Ви, розробник, відповідальний за створення бібліотеки, реалізуєте X, комбінуючи кроки A, B і C, кожен з яких абсолютно нетривіальний. Щоб працювати у вашій бібліотеці, ви додаєте тести, щоб переконатися, що A, B і C працюють правильно. Ви хочете ці тести. Казати "у вас не повинно бути одиничних тестів для приватних методів" зовсім безглуздо. Ви хочете перевірити ці приватні методи. Можливо, хтось вам скаже, що тестування одиничних методів невірно. Але це означає лише, що ви можете їх не називати "одиничними тестами", а "приватними тестами" або так, як ви хочете їх називати.
Мова Swift вирішує проблему, яку ви не хочете виставляти A, B, C як публічні методи лише тому, що ви хочете перевірити її, надавши функціям атрибут "testable". Компілятор дозволяє викликати приватні методи перевірки з одиничних тестів, але не з нетестового коду.