Признаюсь, я новичок в модульном тестировании. Я могу достаточно легко понять концепции (проверить одну вещь, сломать-исправить-проверить-повторить и т. д.), Но у меня возникла небольшая проблема с тем, чтобы подумать об этом ...
Мне было поручено переписать большую часть нашего приложения, и я довольно хорошо разобрался со структурой классов. Мы смешиваем наши тестовые проекты с остальной частью решения, и все ссылки выстраиваются так, как мы хотим. К сожалению, есть несколько классов Friend, к которым можно получить доступ только из одного и того же пространства имен. В его нынешнем виде тестовый класс не является членом этого пространства имен, поэтому я не могу получить прямой доступ ни к одному из этих базовых методов, которые В САМОМ ДЕЛЕ необходимо протестировать.
Из того, что я читал, я мог бы создать общедоступный макет рассматриваемых классов и протестировать его таким образом, но я обеспокоен тем, что в будущем кто-то внесет изменение в производственный код, а не скопирует его в тестовый код, полностью исключающий цель тестирования. Другой вариант - изменить уровень доступа для самих классов, но это повлечет за собой много накладных расходов и возится с уже существующим кодом. Идея написания интерфейса тоже возникла, но создание целой структуры интерфейсов ради тестирования в менеджменте не улетучилось.
Я просто что-то здесь упускаю? Что было бы наилучшим способом убедиться, что эти базовые классы действительно работают правильно, не изменяя доступ к ним?





Я не уверен, что вы имеете в виду проекты .NET / C#, но вы можете добавить атрибут InternalsVisibleTo в файл AssemblyInfo.cs, чтобы предоставить свои классы internal сборке модульного теста.
Допустим, вы создали проект модульного теста под названием «MyApplication.Tests», добавьте его в файл AssemblyInfo.cs проекта «MyApplication» (расположенный в разделе «Свойства»):
[assembly: InternalsVisibleTo("MyApplication.Tests")]
Хм, извините, не знаю синтаксиса VB, но это тот же атрибут :)
Он есть, но использование немного неуклюже. Спасибо, в любом случае.
Вы также можете создать подкласс испытуемого, который находится в том же пространстве имен, что и испытуемый, и этот подкласс может предоставлять любые функции, необходимые для тестирования.
Предполагая, что у вас есть способ дать этому подклассу «тестовую» область видимости, вы дома свободны. (Вам не нужен этот класс в своем обычном коде, поскольку он нарушает инкапсуляцию)
Я думаю, что ваши модульные тесты не должны требовать в исходном коде, поэтому первый ответ определенно работает. Вы рассматривали возможность использования Reflection? Думаю, дело в изменении исходного кода; здесь есть хорошее обсуждение этого: CodeProject
Но разве использование отражения не будет излишним для тестирования? Это просто вызывает тревогу «Ваш код слишком сложен» в глубине моего мозга ...
Ну, это проект VB (проверьте свои огнеметы у двери), но я попробую.