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