Якщо ви маєте на увазі приватне так, як я думаю, ви це маєте на увазі, то ні - вам не слід тестувати його. Вам слід проводити лише тестування на стан поведінки / стану, що спостерігається Можливо, вам не вистачає точки за циклом TDD "червоно-зелений-рефактор" (і якщо ви не робите тест спочатку, застосовується той же принцип). Після тестування та здачі тестів ви не хочете, щоб вони змінювалися під час виконання рефакторингу. Якщо ви змушені використовувати тест приватних функціональних можливостей, це, ймовірно, означає, що одиничні тести навколо загальнодоступних функціональних можливостей є помилковими. Якщо складно і складно написати тести навколо публічного коду, можливо, ваш клас робить занадто багато, або ваша проблема не чітко визначена.
Гірше, що з часом ваші одиничні тести стануть кулькою, а ланцюг сповільнить вас, не додаючи ніяких значень (зміна реалізації, наприклад оптимізація чи видалення дублювання, не повинно впливати на одиничні тести). Однак внутрішній код повинен бути перевірений одиницею, оскільки поведінка / стан спостерігаються (лише обмежено).
Коли я вперше робив тестування, я витягнув всілякі хитрощі для тестування приватних речей, але зараз, маючи кілька років під ременем, я вважаю це гірше, ніж марну часу.
Ось трохи дурного прикладу, звичайно, у реальному житті у вас було б більше тестів, ніж у цих:
Скажімо, у вас є клас, який повертає відсортований список рядків - ви повинні перевірити, чи результат сортований, а не як він насправді сортує цей список. Ви можете розпочати реалізацію за допомогою одного алгоритму, який просто сортує список. Після того, як це зроблено, ваш тест не потрібно змінювати, якщо ви зміните алгоритм сортування. На даний момент у вас є єдиний тест (якщо припустити, що сортування вбудовано у ваш клас):
- Чи сортується мій результат?
Тепер скажіть, що ви хочете два алгоритми (можливо, один є ефективнішим за деяких обставин, але не для інших), тоді кожен алгоритм міг (і взагалі повинен бути) наданий іншим класом, і ваш клас вибирає з них - ви можете перевірити, що це відбувається для обрані вами сценарії з використанням макетів, але ваш оригінальний тест все ще діє, і оскільки ми лише перевіряємо поведінку / стан, що спостерігається, його не потрібно змінювати. Ви закінчуєте 3 тести:
- Чи сортується мій результат?
- Враховуючи сценарій (скажімо, початковий список майже відсортований для початку) - це виклик до класу, який сортує рядки за допомогою алгоритму X?
- Враховуючи сценарій (початковий список знаходиться у випадковому порядку) - це виклик до класу, який сортує рядки за допомогою алгоритму Y?
Альтернативою було б розпочати тестування приватного коду всередині вашого класу - ви нічого не отримуєте з цього - вищевказані тести говорять мені про все, що мені потрібно знати, що стосується одиничного тестування. Додаючи приватні тести, ви будуєте собі прямий піджак, наскільки більше роботи було б, якби ви не тільки перевірили, чи був сортований результат, але і як його сортували?
Тести (такого типу) повинні змінюватися лише тоді, коли змінюється поведінка, починати писати тести проти приватного коду, і це виходить у вікно.