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


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

например:

var result = Manager.Instance.Create(definition)

Это должно быть единственный доступ к библиотеке классов.

на основе параметра definition он использует различные подклассы для создания запрошенного экземпляра и устанавливает его свойства соответственно. Поэтому я хочу как-то уверить тестами, что весь процесс создания работал нормально. Но поскольку я также не хочу раскрывать очень мало внутренних свойств объекта результата, я не могу проверить, используя только этот метод открытого доступа, так как у меня нет никаких свойств для утверждения.

I знайте, что вы не должны проверять внутреннюю механику, и это, как правило, плохой дизайн, и я также читал через в этой статье, но может быть, есть какой-либо способ создать проект библиотеки плюс модульного теста и, возможно, впоследствии ограничить доступ к этому классу? с оберткой, что ли?

2 53

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.