我试图弄清楚我是否应该开始使用更多的内部访问修饰符。
我知道如果我们使用internal并设置程序集变量InternalsVisibleTo,我们可以测试不想在测试项目中声明为公共的函数。
这让我觉得我应该总是使用internal,因为至少每个项目(应该?)都有自己的测试项目。
为什么不应该这样做呢?什么时候应该使用private?
我试图弄清楚我是否应该开始使用更多的内部访问修饰符。
我知道如果我们使用internal并设置程序集变量InternalsVisibleTo,我们可以测试不想在测试项目中声明为公共的函数。
这让我觉得我应该总是使用internal,因为至少每个项目(应该?)都有自己的测试项目。
为什么不应该这样做呢?什么时候应该使用private?
当前回答
内部类需要测试,并且有一个程序集属性:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
将此添加到项目信息文件中,例如Properties\AssemblyInfo.cs,用于测试中的项目。在本例中,“MyTests”是测试项目。
其他回答
除了Eric的回答,你还可以在csproj文件中配置:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
或者如果你每个项目都有一个测试项目要测试,你可以在Directory.Build.props文件中这样做:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>$(MSBuildProjectName).Test</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
参见:https://stackoverflow.com/a/49978185/1678053 例如:https://github.com/gldraphael/evlog/blob/master/Directory.Build.props L5-L12
在。net Core 2.2中,将这一行添加到Program.cs中:
using ...
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("MyAssembly.Unit.Tests")]
namespace
{
...
内部类需要测试,并且有一个程序集属性:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
将此添加到项目信息文件中,例如Properties\AssemblyInfo.cs,用于测试中的项目。在本例中,“MyTests”是测试项目。
从。net 5开始,你也可以在被测试项目的csproj中使用这个语法:
<ItemGroup>
<InternalsVisibleTo Include="MyProject.Tests" />
</ItemGroup>
我使用的是。net Core 3.1.101,对我有用的.csproj添加:
<PropertyGroup>
<!-- Explicitly generate Assembly Info -->
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>MyProject.Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>