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

Phi*_*ray 128 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")]
Run Code Online (Sandbox Code Playgroud)

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

Gro*_*roo 192

根据.NET文档InternalsVisibleToAttribute:

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

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

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


Nic*_* N. 8

虽然第一个答案是完全可以的。如果您仍然希望以原始AssemblyInfo格式执行此操作,则可以始终选择不自动生成文件并手动添加它。

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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


Jan*_*Net 6

如此处所述:

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>
Run Code Online (Sandbox Code Playgroud)

甚至:

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

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


小智 5

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