如何测试类库中的内部类

本文关键字:类库 内部类 测试 何测试 | 更新日期: 2023-09-27 18:04:03

我想写一个类库,为我创建一个复杂的对象,但应该只暴露尽可能少。我希望它被包含到其他项目中,在那里我只有一个调用这个库,例如返回我一个内部创建的类的对象。我不想允许其他人显式地创建这些对象,但是我仍然想为这个类库创建一个测试项目。

例如:

var result = Manager.Instance.Create(definition)

这应该是对类库的唯一访问。

根据定义参数,它使用不同的子类来创建所请求的实例,并相应地设置其属性。因此,我想通过测试来确保整个创作过程运行良好。但是,由于我也不想暴露结果对象的非常少的内部属性,因此不能仅通过使用此公共访问方法进行测试,因为我没有任何要断言的属性。

我知道你不应该测试内部机制,这通常是糟糕的设计,我也读了这篇文章,但是有没有办法创建一个库加单元测试项目,然后限制对这个类的访问?用包装纸什么的?

如何测试类库中的内部类

在。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项目名称。

您可以通过添加InternalsVisibleTo来检查obj文件夹(obj'Debug'netstandard2.0)中的ProjectName.AssemblyInfo.cs已经更新。

在我的例子中(NET5应用程序)我需要两个csproj条目:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>MyAppName.UnitTests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

和internalvisible属性到我的类中以使其工作:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 
namespace MyAppName.Api.Something...