关于c#:如何测试内部类库?

How to test internal class library?

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

例如:

1
var result = Manager.Instance.Create(definition)

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

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

我知道你不应该测试内部机制,它通常是糟糕的设计,我也正在阅读这篇文章,但是没有任何方法可以创建一个库加单元测试项目,也许之后限制访问这个类?用包装纸什么的?


在.NET中,可以使用类库中的InternalsVisibleToAttribute来使单元测试项目可以看到内部类型。

这样,您可以将您的类保持在内部,并仍然可以从您提供访问权限的其他程序集中使用它。

你这样使用它:

1
[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]


对于最新的csproj 2017格式化项目,如果您的项目没有AssemblyInfo.cs文件,则可以添加以下内容:

1
2
3
4
5
  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

您还可以使用其他变量来重新放置MSBuildProjectName,例如AssemblyName或直接使用unittest项目名称。

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