【问题标题】:Is there an access modifier that limits to a solution?是否存在限制解决方案的访问修饰符?
【发布时间】:2016-03-12 08:46:45
【问题描述】:

在我的 .NET 解决方案中,我有两个项目:一个主项目和一个针对主项目运行测试的项目。在我的项目中,我有几种方法我想保持“私有”,但也想运行测试。是否有一种访问方法可以将这些功能限制在我的解决方案内部?

【问题讨论】:

  • 有人可能会争辩说您应该只测试您的公共 API,但您可以使用 internal 和 InternalsVisibleTo 来让测试项目看到它们。

标签: c# .net access-modifiers


【解决方案1】:

您正在寻找InternalsVisibleTo 属性。

此属性允许您指定应该有权访问您的程序集内部的类型和方法的其他程序集。因此,在您的主项目 AssemblyInfo.cs 文件(或任何其他源文件)中,您可以指定您的测试项目是“朋友程序集”并且应该可以访问您的主项目的内部:

[assembly:InternalsVisibleTo("MainProject.Tests")]

附带说明,正如 Alexei 所指出的,如果您的 MainProject 使用强名称密钥进行签名,则任何“朋友”程序集也必须进行签名。这是解释here

虽然,正如另一条评论中提到的那样。最佳做法是使用其公共 API 测试您的程序集。

【讨论】:

  • 旁注:InternalsVisibleTo 方法不适用于许多人,因为签名要求很高。
【解决方案2】:

您可以使用InternalsVisibleTo 属性使internal 类型和方法对选定的程序集可见。

但是,您应该尝试设计您的 API,以便仅使用公共接口对其进行测试。

【讨论】:

    【解决方案3】:

    您应该认真考虑一下解决方案的架构。这种气味通常表明您的班级一次做太多事情。

    一个简单的解决方法是将这个责任(那些私有方法)提取到另一个类,然后它们变成public 并且可以开箱即用地进行测试...

    【讨论】:

      【解决方案4】:

      不,没有办法限制对“公正解决方案”的访问。

      原因是解决方案只是一组项目。一个项目可以在任意数量的解决方案中。因此,即使您“限制”访问包含在一个解决方案中的项目,您/其他人也可以创建另一个解决方案,该解决方案需要以某种方式神奇地访问方法。

      额外构建的程序集不包含任何关于它属于哪个解决方案的信息 - 因此在运行时没有任何信息可以检查访问。


      对于您的特殊问题 - InternalsVisibleTo(如 other answers 所示)将允许访问您允许的项目的内部方法(需要强签名程序集)或重构您的代码以避免需要测试私有方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2014-07-31
        • 1970-01-01
        相关资源
        最近更新 更多