我想编写这为我创建一个复杂的对象,但只能暴露尽可能少的类库。 我希望它被包含到其它项目中,有我只有一个调用此库,例如返回我创建内部类的对象。 我不想让其他人明确地创建这些对象,但我仍然要创建这个类库一个测试项目。
例如:
var result = Manager.Instance.Create(definition)
这应该是类库的唯一通道。
基于定义的参数,它使用不同的子类来创建的请求实例,并相应地设置其属性。 因此,我想通过整个创建过程中运行良好的测试在某种程度上保证。 但因为我也不想暴露结果对象的很少的内部属性嫌我不能只用这种公共访问方法,因为我没有任何属性断言上测试。
我知道,你不应该测试内部机制,它通常是坏的设计,我还通过阅读这篇文章 ,但不存在任何可能的方式来创建一个图书馆加上单元测试项目,也许事后限制访问本class ? 有包装的东西?
在.NET中可以使用InternalsVisibleToAttribute在你的类库,使您的内部类型可见你的单元测试项目。
这样,你可以使你的类内部,仍然使用它从你给访问其他组件。
您可以使用这样的:
[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
有关最新的csproj 2017年格式化的项目,如果您的项目不具备AssemblyInfo.cs
文件,你可以添加以下内容:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
您还可以使用其他变量来relplace MSBuildProjectName
如AssemblyName
或直接使用单元测试的项目名称。
您可以检查ProjectName.AssemblyInfo.cs
在OBJ文件夹( obj\Debug\netstandard2.0
)已加入更新InternalsVisibleTo
。