如何测试内部类库?

Tho*_*del 56 c# unit-testing internal wrapper

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

例如:

var result = Manager.Instance.Create(definition)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Wou*_*ort 133

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

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

你这样使用它:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
Run Code Online (Sandbox Code Playgroud)

  • 好方案!一些额外的信息:1)如果这个`[assembly:...]`语法不响铃:这些是汇编属性(http://msdn.microsoft.com/en-us/library/4w8c1y2s.aspx ),其中最着名的是"AssemblyVersionAttribute"及其兄弟.2)您可以在项目中的任何.cs文件中,在命名空间之外使用它们,但通常,它们在位于"属性"项目文件夹中的`AssemblyInfo`文件中指定.3)如果项目不同,您必须确定项目的*name*,而不是*namespace*. (11认同)

Fei*_*hou 5

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

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

您还可以使用其他变量进行替换,MSBuildProjectName例如AssemblyName或直接使用unittest项目名称。

您可以通过添加来检查ProjectName.AssemblyInfo.csobj文件夹(obj\Debug\netstandard2.0)中的更新InternalsVisibleTo