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类,我想知道您是否还可以对内部方法进行单元测试?
根据
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")] |
虽然第一个答案非常好。如果您仍想在原始
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连接。但没有人傻到使用诊断端口开车。