Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как тестрировать private и protected методы?


Как тестировать private и protected методы, может есть какие-то стандартные средства, позволяющие сделать это?
В интернете видел примеры, что подобные методы вызываются через рефлексию, или 
них тупо меняют модификатор доступа на public на время теста. 
    


Ответы

Ответ 1



У класса есть интерфейс - это совокупность его открытых методов. Тем самым он подобе черному ящику - вы что-то даете на вход, внутри ящика(класса) происходят некие таинственны процессы, а затем он выдает вам результат этих загадочных процессов. Поэтому любом пользователю класса важно чтобы должным образом работал именно этот интерфейс, и неважно, за счет чего он работает - за счет хитрых колдунств, безупречной логики или чего-то еще. О наличии приватных методов он ничего не знает и знать не должен. Соответственно, тестирование имеет смысл только для публичных методов. Если они работают должным образом, то и класс работает должным образом. А его внутренности - это его личное дело.

Ответ 2



Никак. private- и protected-методы не принадлежат официальному «фасаду» класса, на них нет специфицированных пред- и постусловий. Тестируйте публичные методы, на то они и публичные. Подглядывать в грязное бель имплементации — некрасиво.

Ответ 3



Попробуйте сделать их internal и использовать аттрибут InternalsVisibleTo

Ответ 4



Если в приватных методах достаточно большое количество логики - подумайте о выносе их в отдельный класс, в котором они будут простыми, публичными и тестируемыми. Пример: Надо протестировать класс построителя навмеша. Грубо говоря, у него на входе 3D модел местности, а на выходе 3D модель навмеша. Внутренняя логика же достаточно сложна (десятки тысяч строк кода). Соответственно для юнит-тестирования, надо разбивать монолит на множество простых/примитивны классов (геометрические методы, построитель высот, вектора, триангуляторы и прочие) и тестировать их по отдельности юнит-тестами, и вместе - интеграционными.

Ответ 5



Можно создать новую публичную функцию с префиксом "test" и с теми же аргументами Использование таких функций легко отследить. Их легко найти (и, следовательно, удалить) в нужный момент. Примечание: В Python для обозначения приватности используется "__". Но там можн получить доступ даже к приватному методу, прописав этот спецификатор. Возможно, я ошибся в деталях, но суть такая.

Комментариев нет:

Отправить комментарий