#c_sharp #visual_studio_2012
Как получить доступ к private методу? C#, VS 2012. Спасибо. P.S. Прежнее название темы - "Unit Test для private методов"
Ответы
Ответ 1
@Track (В коммент точно не влезло бы :) Как речь может идти о Unit тестах, но при этом не идти о рефакторинге? Когда девелопится какой-то продукт, у разработчика всего два возможных варианта действий — либо писать нормальный production код, либо писать write-only код, который сразу после этого летит на помойку (Spike в терминологии Extreme Programming). В первом случае Unit тесты специфицируют поведение этого кода и неразрывно связаны с рефакторингом, поскольку позволяют уменьшить количество ошибок при его выполнении. Во втором случае Unit тесты не нужны по определению. Если рассуждать на тему вопроса, то тестирование private методов бессмысленно по нескольким причинам: Гипотетический зеленый Unit тест для приватного метода не дает никаких знаний о поведении соответствующего класса. Этот private метод может вообще не вызываться из public методов класса, а у вас добавится ненужный тест, который еще и надо поддерживать. Контракты private методов крайне изменчивы. Сегодня, скажем, метод называется SafelyCreateBlackBox(...), а завтра — ReconstructContainerFromScratch(...). Оно полностью противоречит концепции TDD, в которой дизайн продукта продиктован спецификацией его поведения в виде набора тестов. Вы же не станете начинать разработку с написания тестов на private методы несуществующих классов? :) То, что в какой-то момент времени вам захотелось написать тест на private метод, скорее всего, означает одно из двух: У вас нет тестов и есть некоторый класс с большим количеством ответственностей. Вы пытаетесь убедиться в корректности его поведения "по кусочкам", например, начав с тестирования private методов. Правильнее в этом случае нужно понять, какое поведение ожидается от класса, заспецифицировать это поведение в тестах, использующих public интерфейс класса и провести рефакторинг этого класса с целью уменьшения числа его ответственностей. У вас есть тесты и вам все еще кажется, что тестирование private метода — это хорошая идея. В таком случае, скорее всего, логика private метода неплохо укладывается в некоторую отдельную сущность и может быть вынесена из исходного класса. В этом случае нужно придумать название для новой сущности, специфицировать ее поведение в тестах и вынести ее из исходного класса.Ответ 2
Начнём с того, что private-методы не предназначены для тестирования. Они не являются частью официального "фасада" класса, они имеют право рассчитывать на выполнение инвариантов и предварительных условий, но не проверять их явно, имеют право вести себя "неправильно", будучи вызванными в не рамках установленного для них workflow. Вы, однако, можете тестировать internal-методы. Они будут доступны тестирующей сборке, если вы укажете атрибут InternalsVisibleTo.Ответ 3
Решение - использовать Reflection например так: var field = typeof(CopyItems).GetMethod(("FixRenamedPath"), BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); string targetFile = (string)field.Invoke(null, new object[] { renamedFile, relatedFile, targetDir });
Комментариев нет:
Отправить комментарий