Как проверить внутреннюю библиотеку классов?
Я хотел бы написать библиотеку классов, которая создает для меня сложный объект, но должна быть открыта как можно меньше. Я хочу, чтобы он был включен в другие проекты, и там у меня есть только один вызов этой библиотеки, который, например, возвращает мне объект внутренне созданного класса. Я не хочу, чтобы другие создавали эти объекты явно, но все же я хочу создать тестовый проект для этой библиотеки классов.
например:
var result = Manager.Instance.Create(definition)
Это должно быть единственный доступ к библиотеке классов.
на основе параметра definition он использует различные подклассы для создания запрошенного экземпляра и устанавливает его свойства соответственно. Поэтому я хочу как-то уверить тестами, что весь процесс создания работал нормально. Но поскольку я также не хочу раскрывать очень мало внутренних свойств объекта результата, я не могу проверить, используя только этот метод открытого доступа, так как у меня нет никаких свойств для утверждения.
I знайте, что вы не должны проверять внутреннюю механику, и это, как правило, плохой дизайн, и я также читал через в этой статье, но может быть, есть какой-либо способ создать проект библиотеки плюс модульного теста и, возможно, впоследствии ограничить доступ к этому классу? с оберткой, что ли?
2 ответа:
в .NET можно использовать InternalsVisibleToAttribute в библиотеке классов, чтобы сделать ваши внутренние типы видимыми для вашего проекта модульного теста.
таким образом, вы можете сохранить свой класс внутри и по-прежнему использовать его из других сборок, к которым вы предоставляете доступ.
вы используете его так:
[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
для последних проектов csproj 2017 formated, если ваш проект не имеет , вы можете добавить следующее:
<ItemGroup> <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"> <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1> </AssemblyAttribute> </ItemGroup>
вы также можете использовать другие переменные для relplace
MSBuildProjectName
напримерAssemblyName
или используйте имя проекта unittest напрямую.вы можете проверить
ProjectName.AssemblyInfo.cs
в папке obj (obj\Debug\netstandard2.0
) был обновлен путем добавленияInternalsVisibleTo
.