Как проверить внутреннюю библиотеку классов?
Я хотел бы написать библиотеку классов, которая создает для меня сложный объект, но должна быть представлена как можно меньше. Я хочу, чтобы он был включен в другие проекты, и у меня есть только один вызов этой библиотеки, который, например, возвращает мне объект внутреннего класса. Я не хочу позволить другим явно создавать эти объекты, но все же я хочу создать тестовый проект для этой библиотеки классов.
Например:
var result = Manager.Instance.Create(definition)
Это должен быть единственный доступ к библиотеке классов.
Основываясь на параметре определения, он использует разные подклассы для создания запрошенного экземпляра и соответственно устанавливает его свойства. Поэтому я хочу как-то заверить с помощью тестов, что весь процесс создания работал нормально. Но так как я также не хочу показывать очень мало внутренних свойств объекта результата, я не могу проверить, используя только этот метод открытого доступа, так как у меня нет никаких свойств для утверждения.
Я знаю, что вы не должны проверять внутреннюю механику, и это, как правило, плохой дизайн, и я также читал эту статью, но разве нет никакого способа создать проект библиотеки плюс модульный тест и, возможно, впоследствии ограничить доступ к этому классу?? с оберткой что ли?
3 ответа
В.NET можно использовать InternalsVisibleToAttribute в вашей библиотеке классов, чтобы сделать ваши внутренние типы видимыми для вашего проекта модульного теста.
Таким образом, вы можете сохранить свой класс внутренним и при этом использовать его из других сборок, к которым у вас есть доступ.
Вы используете это так:
[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
Для последних форматированных проектов csproj 2017, если ваш проект не имеет AssemblyInfo.cs
файл, вы можете добавить следующее:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
Вы также можете использовать другие переменные для замены MSBuildProjectName
такие как AssemblyName
или используйте имя проекта unittest напрямую.
Вы можете проверить ProjectName.AssemblyInfo.cs
в папке obj (obj\Debug\netstandard2.0
) был обновлен путем добавления InternalsVisibleTo
,
В моем случае (приложение .NET5) мне нужна была запись csproj:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyAppName.UnitTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
и атрибут internalvisibleto для моего класса, чтобы это работало:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
namespace MyAppName.Api.Something...