我试图弄清楚我是否应该开始使用更多的内部访问修饰符。

我知道如果我们使用internal并设置程序集变量InternalsVisibleTo,我们可以测试不想在测试项目中声明为公共的函数。

这让我觉得我应该总是使用internal,因为至少每个项目(应该?)都有自己的测试项目。

为什么不应该这样做呢?什么时候应该使用private?


当前回答

从。net 5开始,你也可以在被测试项目的csproj中使用这个语法:

  <ItemGroup>
    <InternalsVisibleTo Include="MyProject.Tests" />
  </ItemGroup>

其他回答

从。net 5开始,你也可以在被测试项目的csproj中使用这个语法:

  <ItemGroup>
    <InternalsVisibleTo Include="MyProject.Tests" />
  </ItemGroup>

你也可以使用private,你可以调用带有反射的private方法。如果你使用Visual Studio Team Suite,它有一些很好的功能,会生成一个代理来调用你的私有方法。下面是一篇代码项目文章,演示了如何自己对私有方法和受保护方法进行单元测试:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

至于应该使用哪个访问修饰符,我的一般经验法则是先使用private,然后根据需要逐步升级。通过这种方式,您将尽可能少地暴露类的内部细节,这有助于保持实现细节的隐藏,就像它们应该隐藏的那样。

内部类需要测试,并且有一个程序集属性:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

将此添加到项目信息文件中,例如Properties\AssemblyInfo.cs,用于测试中的项目。在本例中,“MyTests”是测试项目。

在。net Core 2.2中,将这一行添加到Program.cs中:

using ...
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("MyAssembly.Unit.Tests")]

namespace
{
...

对于.NET core,您可以将属性添加到命名空间 [组装:InternalsVisibleTo(“MyUnitTestsAssemblyName”)]。 例如:

using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Applications.ExampleApp.Tests")]
namespace Applications.ExampleApp
 internal sealed class ASampleClass : IDisposable
    {
        private const string ApiVersionPath = @"api/v1/";
        ......
        ......
        ......
        }
    }