如何测试类库中的内部类
本文关键字:类库 内部类 测试 何测试 | 更新日期: 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...