在VS2017 .Net标准库中对内部方法进行单元测试

时间:2017-02-14 20:16:20

标签: c# unit-testing visual-studio-2017 .net-standard

我目前正在使用最新的Visual Studio 2017 Release Candidate来创建.Net Standard 1.6库。我正在使用xUnit对我的代码进行单元测试,并且想知道你是否还可以在VS2017中测试内部方法。

我记得你可以在VS2015中使用所有可以使指定项目看到内部方法的AssemblyInfo.cs类

[assembly:InternalsVisibleTo("MyTests")]

由于VS2017 .Net标准项目中没有AssemblyInfo.cs类,我想知道您是否还可以对内部方法进行单元测试?

5 个答案:

答案 0 :(得分:162)

根据.NET docs for the InternalsVisibleToAttribute

  

该属性在程序集级别应用。这意味着它可以包含在源代码文件的开头,也可以包含在Visual Studio项目的AssemblyInfo文件中。

换句话说,你可以简单地将它放在你自己任意命名的.cs文件中,它应该可以正常工作:

// some .cs file included in your project
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]

答案 1 :(得分:10)

如此处所述:

https://blog.sanderaernouts.com/make-internals-visible-with-new-csproj-format

可以通过添加另一个ItemGroup在项目文件中添加内部可见属性:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

甚至:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

我喜欢该解决方案,因为项目文件似乎是定义此类问题的正确位置。

答案 2 :(得分:5)

“InternalsVisibleTo”属性是测试.Net的任何类型的“白盒子”(十年的期限,我猜)的关键。它可以放在任何带有前面“assembly”属性的c#文件中。请注意,MS DOC表示程序集名称必须由公钥标记限定(如果已签名)。有时这不起作用,必须使用完整的公钥。访问内部是测试并发系统和许多其他情况的关键。见https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054。在本书中,Meszaros描述了各种编码风格,它们基本上构成了程序开发的“设计测试”方法。至少这是我多年来使用它的方式。

答案 3 :(得分:3)

第一个答案很好。如果您仍然希望在原始AssemblyInfo中执行此操作,则可以始终选择不自动生成文件并手动添加。

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

有关更多信息: https://stackoverflow.com/a/47075759/869033

答案 4 :(得分:0)

另一种方法是在目标项目中使用“包装器” TestMyFoo公共类,该类具有来自您需要测试的类的公共方法和继承(例如MyFoo)。这些公共方法只是调用要测试的基类。

这不是“理想”的选择,因为您最终在目标项目中交付了一个测试钩子。但是请考虑带有诊断端口的现代可靠汽车和带有JTAG连接的现代可靠电子产品。但是没有人足够傻,无法使用诊断端口驾驶汽车。

相关问题