我想编写一个类库,它为我创建了一个复杂的对象,但只应尽可能少地公开。我希望它被包含在其他项目中,在那里我只有一个对这个库的调用,例如返回一个内部创建的类的对象。我不想让其他人明确地创建这些对象,但我仍然想为这个类库创建一个测试项目。
例如:
var result = Manager.Instance.Create(definition)
这应该是对类库的唯一访问。
基于definition参数,它使用不同的子类来创建请求的实例并相应地设置其属性。因此,我想通过测试以某种方式确保整个创建过程运行良好。但是因为我也不想暴露结果对象的非常少的内部属性,所以我不能仅使用这种公共访问方法进行测试,因为我没有任何属性可以断言。
我知道你不应该测试内部机制,它通常是糟糕的设计,我也在阅读this article,但是没有任何方法可以创建一个库加单元测试项目,也许之后限制访问这个类?用包装或什么东西?
答案 0 :(得分:130)
在.NET中,您可以使用类库中的InternalsVisibleToAttribute来使您的内部类型对您的单元测试项目可见。
这样,您可以将您的类保持在内部,并仍然可以从您提供访问权限的其他程序集中使用它。
你这样使用它:
[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
答案 1 :(得分:4)
对于最新的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
)是否已更新。