如何测试内部类库?

时间:2013-03-15 19:47:04

标签: c# unit-testing wrapper internal

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

例如:

var result = Manager.Instance.Create(definition)

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

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

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

2 个答案:

答案 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.0InternalsVisibleTo)是否已更新。