В настоящее время я участвую в разработке с С#. Вот несколько примеров: Мы внедряем MVP с нашим клиентским приложением, и у нас есть циклическое правило, в котором говорится, что ни один метод не должен иметь цикломатическую сложность, превышающую 5. Это приводит к множеству небольших частных методов, которые обычно отвечают за одну вещь.
Мой вопрос об модульном тестировании класса:
Тестирование частной реализации с помощью общедоступных методов - все в порядке... У меня нет проблем с этим.
Но... как насчет следующих случаев:
Пример 1. Обработать результат запроса на восстановление async-данных (метод обратного вызова не должен быть общедоступным для тестирования)
Пример 2. Обработчик событий, выполняющий операцию (например, обновление текста метки представления - глупый пример, который я знаю...)
Пример 3.. Вы используете стороннюю структуру, которая позволяет расширять, переопределяя защищенные виртуальные методы (путь от общедоступных методов к этим виртуальным методам обычно рассматривается как программирование черного ящика и будет имеют все виды зависимостей, которые обеспечивает структура, о которой вы не хотите знать)
Приведенные выше примеры не кажутся мне результатом плохого дизайна. Они также не являются кандидатами на переход к отдельному классу для тестирования в изоляции, поскольку такие методы потеряют свой контекст.
У кого-нибудь есть мысли об этом?
Cheers, Джейсон
EDIT: Я не думаю, что я был достаточно ясен в своем первоначальном вопросе - я могу тестировать частные методы с помощью аксессуаров и издеваться над вызовами/методами с помощью TypeMock. Это не проблема. Проблема заключается в проверке вещей, которые не должны быть общедоступными или не могут быть общедоступными.
Я не хочу, чтобы код был общедоступным для тестирования, поскольку он может вводить лазейки безопасности (только публикация интерфейса, чтобы скрыть это, не является вариантом, потому что любой может просто вернуть объект к исходному типу и получить доступ чтобы я не хотел, чтобы они)
Кодекс, который получает рефакторинг для другого класса для тестирования, в порядке, но может потерять контекст. Я всегда считал, что плохая практика имеет "вспомогательные" классы, которые могут содержать горшок с кодом без какого-либо конкретного контекста (здесь мы думаем о SRP). Я действительно не думаю, что это работает и для обработчиков событий.
Я рад, что оказался ошибочным - я просто не уверен, как проверить эту функциональность! Я всегда думал, что если он может сломаться или измениться - протестируйте его.
Приветствия, Джейсон