Как вы проводите модульное тестирование различных уровней доступа к классам?

Признаюсь, я новичок в модульном тестировании. Я могу достаточно легко понять концепции (проверить одну вещь, сломать-исправить-проверить-повторить и т. д.), Но у меня возникла небольшая проблема с тем, чтобы подумать об этом ...

Мне было поручено переписать большую часть нашего приложения, и я довольно хорошо разобрался со структурой классов. Мы смешиваем наши тестовые проекты с остальной частью решения, и все ссылки выстраиваются так, как мы хотим. К сожалению, есть несколько классов Friend, к которым можно получить доступ только из одного и того же пространства имен. В его нынешнем виде тестовый класс не является членом этого пространства имен, поэтому я не могу получить прямой доступ ни к одному из этих базовых методов, которые В САМОМ ДЕЛЕ необходимо протестировать.

Из того, что я читал, я мог бы создать общедоступный макет рассматриваемых классов и протестировать его таким образом, но я обеспокоен тем, что в будущем кто-то внесет изменение в производственный код, а не скопирует его в тестовый код, полностью исключающий цель тестирования. Другой вариант - изменить уровень доступа для самих классов, но это повлечет за собой много накладных расходов и возится с уже существующим кодом. Идея написания интерфейса тоже возникла, но создание целой структуры интерфейсов ради тестирования в менеджменте не улетучилось.

Я просто что-то здесь упускаю? Что было бы наилучшим способом убедиться, что эти базовые классы действительно работают правильно, не изменяя доступ к ним?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
334
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не уверен, что вы имеете в виду проекты .NET / C#, но вы можете добавить атрибут InternalsVisibleTo в файл AssemblyInfo.cs, чтобы предоставить свои классы internal сборке модульного теста.

Допустим, вы создали проект модульного теста под названием «MyApplication.Tests», добавьте его в файл AssemblyInfo.cs проекта «MyApplication» (расположенный в разделе «Свойства»):

[assembly: InternalsVisibleTo("MyApplication.Tests")]

Ну, это проект VB (проверьте свои огнеметы у двери), но я попробую.

Lieutenant Frost 28.10.2008 00:05

Хм, извините, не знаю синтаксиса VB, но это тот же атрибут :)

Igal Tabachnik 28.10.2008 00:07

Он есть, но использование немного неуклюже. Спасибо, в любом случае.

Lieutenant Frost 28.10.2008 00:17
Ответ принят как подходящий

Вы также можете создать подкласс испытуемого, который находится в том же пространстве имен, что и испытуемый, и этот подкласс может предоставлять любые функции, необходимые для тестирования.

Предполагая, что у вас есть способ дать этому подклассу «тестовую» область видимости, вы дома свободны. (Вам не нужен этот класс в своем обычном коде, поскольку он нарушает инкапсуляцию)

Я думаю, что ваши модульные тесты не должны требовать в исходном коде, поэтому первый ответ определенно работает. Вы рассматривали возможность использования Reflection? Думаю, дело в изменении исходного кода; здесь есть хорошее обсуждение этого: CodeProject

Но разве использование отражения не будет излишним для тестирования? Это просто вызывает тревогу «Ваш код слишком сложен» в глубине моего мозга ...

Lieutenant Frost 28.10.2008 00:26

Другие вопросы по теме