Как проверить внутреннюю библиотеку классов?

Я хотел бы написать библиотеку классов, которая создает для меня сложный объект, но должна быть представлена ​​как можно меньше. Я хочу, чтобы он был включен в другие проекты, и у меня есть только один вызов этой библиотеки, который, например, возвращает мне объект внутреннего класса. Я не хочу позволить другим явно создавать эти объекты, но все же я хочу создать тестовый проект для этой библиотеки классов.

Например:

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...
Другие вопросы по тегам