Ответ 1
Для достижения этой цели вы можете использовать атрибут уровня сборки InternalsVisibleToAttribute.
Добавить
[assembly:InternalsVisibleTo("MyProjectTests")]
в AssemblyInfo.cs в вашей сборке MyProject.
Я перехожу в модульное тестирование Visual-Studio 2008, и мне интересно, какой лучший способ выполнить кросс-сборку class
для тестирования.
В принципе, у меня есть два проекта в одном решении:
Все в MyProject в настоящее время имеет доступ по умолчанию, который, если я правильно помню, означает, что все эффективно internal
. Я в основном стараюсь тестировать уровень class
, но есть несколько delegates
.
В будущем, вероятно, будет внешний API, но я буду около 20% от того, как вы можете выполнить полный (по крайней мере, на бумаге), и я получаю довольно много вопросов, накладывая больше кода поверх этого непроверенного ядро. Соответственно, я хотел бы провести некоторое тестирование, прежде чем приложение будет достаточно полным для традиционного (читай: плохого и/или ленивого) функционального тестирования и, безусловно, до выхода внешнего API версии n + 1.
В дополнение к прямому ответу, был бы весьма полезен пример решения.
Для достижения этой цели вы можете использовать атрибут уровня сборки InternalsVisibleToAttribute.
Добавить
[assembly:InternalsVisibleTo("MyProjectTests")]
в AssemblyInfo.cs в вашей сборке MyProject.
Вам нужно добавить
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
в AssemblyInfo.cs вашего "MyProject (С#)". Это позволяет вашим тестам получить доступ к внутренним методам тестирования.
Вы можете протестировать внутренние методы, добавив атрибут к AssemblyInfo.cs для вашего основного проекта, предоставив доступ к внутренним методам для именованной сборки:
[сборка: InternalsVisibleTo ( "MyProjectTestsNameSpace.MyProjectTests" )]
Дополнительная информация здесь
Похоже, вам нужен InternalsVisibleToAttribute
Однако я бы рекомендовал против этого подхода - протестировать свои внутренние классы через открытый интерфейс или API.
Хотя [InternalsVisibleTo]
является наиболее разумным способом ИМО, есть по крайней мере два других способа сделать это:
Используя Отражение
var method = instance.GetType().GetMethod(
methodName, BindingFlags.NonPublic | BindingFlags.Instance,
null, paramTypeArray, null);
return method.Invoke(instance, parameters);
Проблема с этим подходом заключается в том, что если имя метода или подпись меняются, unit test начнет сбой во время выполнения, тогда как [InternalsVisibleTo]
легко подхватит это нарушение во время компиляции.
Moles / Fakes
или TypeMock