关于c#:单元测试VS2017 .Net标准库中的内部方法

Unit testing internal methods in VS2017 .Net Standard library

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

我记得你可以在VS2015中使用一行AssemblyInfo.cs类来使指定的项目能够看到内部方法

1
[assembly:InternalsVisibleTo("MyTests")]

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


根据InternalsVisibleToAttribute的.NET文档:

The attribute is applied at the assembly level. This means that it can be included at the beginning of a source code file, or it can be included in the AssemblyInfo file in a Visual Studio project.

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

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


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

1
2
3
<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

欲获得更多信息:
https://stackoverflow.com/a/47075759/869033


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


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

当您最终在目标项目中运送测试挂钩时,它并不"理想"。但考虑到现代可靠的汽车配备诊断端口和现代可靠的电子船与JTAG连接。但没有人傻到使用诊断端口开车。