Если вы имеете в виду частное, как я думаю, вы это имеете в виду, то нет - вам не следует это тестировать. Вы должны только проводить модульное тестирование наблюдаемого поведения / состояния. Возможно, вы упускаете точку за циклом «красный-зеленый-рефактор» TDD (и если вы сначала не проводите тестирование, то применяется тот же принцип). После того, как тесты написаны и пройдены, вы не хотите, чтобы они менялись при выполнении рефакторинга. Если вы вынуждены проводить модульное тестирование приватной функциональности, то это, вероятно, означает, что модульные тесты вокруг публичной функциональности имеют недостатки. Если сложно и сложно писать тесты для открытого кода, то, возможно, ваш класс делает слишком много или ваша проблема четко не определена.
Хуже того, со временем ваши юнит-тесты станут шариком и цепью, замедляя вас, не добавляя никакой ценности (изменение реализации, например, оптимизация или удаление дублирования, не должно влиять на юнит-тесты). Внутренний код должен, однако, быть проверен модулем, так как поведение / состояние можно наблюдать (только ограниченным образом).
Когда я впервые проводил модульное тестирование, я применял всевозможные трюки к частным тестам, но теперь, когда у меня за плечами несколько лет, я вижу это хуже, чем трата времени.
Вот немного глупый пример, конечно, в реальной жизни у вас будет больше тестов, чем они:
Допустим, у вас есть класс, который возвращает отсортированный список строк - вы должны проверить, отсортирован ли результат, а не то, как он на самом деле сортирует этот список. Вы можете начать реализацию с одного алгоритма, который просто сортирует список. Как только это будет сделано, ваш тест не нужно менять, если вы измените алгоритм сортировки. На данный момент у вас есть один тест (при условии, что сортировка встроена в ваш класс):
- Мой результат отсортирован?
Теперь предположим, что вам нужно два алгоритма (возможно, один более эффективен в некоторых обстоятельствах, но не в других), тогда каждый алгоритм может (и, как правило, должен) предоставляться другим классом, и ваш класс выбирает их - вы можете проверить, происходит ли это для в выбранных вами сценариях используются макеты, но ваш первоначальный тест все еще действителен, и, поскольку мы только проверяем наблюдаемое поведение / состояние, его не нужно изменять. В итоге вы пройдете 3 теста:
- Мой результат отсортирован?
- При заданном сценарии (скажем, начальный список почти отсортирован для начала) является ли вызов класса, который сортирует строки с использованием алгоритма X?
- При заданном сценарии (начальный список в случайном порядке) выполняется ли вызов класса, который сортирует строки с использованием алгоритма Y?
В качестве альтернативы можно было бы начать тестирование частного кода внутри вашего класса - вы ничего от этого не получите - вышеприведенные тесты рассказывают мне все, что мне нужно знать, что касается модульного тестирования. Добавляя частные тесты, вы создаете себе прямую оболочку, сколько еще работы будет, если вы не только проверите, что результат был отсортирован, но и как он сортируется?
Тесты (такого типа) должны изменяться только при изменении поведения, начинать писать тесты для частного кода, и это выходит за рамки.