How to test internal class library?
我想写一个类库,它为我创建一个复杂的对象,但应该尽可能少地暴露。我希望它被包含在其他项目中,在那里我只有一个对这个库的调用,例如返回一个内部创建的类的对象。我不想让其他人明确地创建这些对象,但我仍然想为这个类库创建一个测试项目。
例如:
1 | var result = Manager.Instance.Create(definition) |
这应该是对类库的唯一访问。
基于definition参数,它使用不同的子类来创建请求的实例并相应地设置其属性。因此,我想通过测试以某种方式确保整个创建过程运行良好。但是因为我也不想暴露结果对象的非常少的内部属性,所以我不能仅使用这种公共访问方法进行测试,因为我没有任何属性可以断言。
我知道你不应该测试内部机制,它通常是糟糕的设计,我也正在阅读这篇文章,但是没有任何方法可以创建一个库加单元测试项目,也许之后限制访问这个类?用包装纸什么的?
在.NET中,可以使用类库中的InternalsVisibleToAttribute来使单元测试项目可以看到内部类型。
这样,您可以将您的类保持在内部,并仍然可以从您提供访问权限的其他程序集中使用它。
你这样使用它:
1 | [assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] |
对于最新的csproj 2017格式化项目,如果您的项目没有
1 2 3 4 5 | <ItemGroup> <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"> <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1> </AssemblyAttribute> </ItemGroup> |
您还可以使用其他变量来重新放置
您可以通过添加
etstandard2.0