【问题标题】:How do I allow assembly (unit testing one) to access internal properties of another assembly?如何允许程序集(单元测试)访问另一个程序集的内部属性?
【发布时间】:2010-09-08 07:02:33
【问题描述】:

我希望我的核心程序集不公开某个类,并且我仍然希望能够对其进行测试。我该怎么做?

【问题讨论】:

    标签: .net unit-testing


    【解决方案1】:

    InternalsVisibleTo 属性来救援!

    只需添加:

    [assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
    

    到您的核心类 AssemblyInfo.cs 文件

    请参阅 Friend Assemblies (C# Programming Guide) 了解最佳做法。

    【讨论】:

    • 我刚刚按照 aku 链接到的指导使用强命名程序集成功完成了这项工作。我确实有一个问题。配置完所有内容后,我必须重新启动 Visual Studio 才能使 Intellisense 工作。它会在重启前编译,但总是显示红线。
    【解决方案2】:

    使用 InternalsVisible,如果您的程序集被强命名,您需要指定公钥(注意:完整密钥不是公钥令牌)例如...

    [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests, 
      PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
    

    以下技巧对于在不使用 cmd 行的情况下获取公钥非常有用...

    http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx

    【讨论】:

      【解决方案3】:

      我将单元测试与其正在测试的代码放在同一个程序集中。这对我来说很有意义,因为我认为“测试自己”是一个类的一个特征,以及“初始化自己”和“描述自己”之类的东西。

      我听到了一些反对这种方法的声音,但其中很少有人能令人信服。

      这会损害性能 呸,我说!没有硬数据就不要优化!也许如果您计划通过慢速链接下载程序集,那么最小化程序集大小是值得的。

      存在安全风险。仅当您的测试中有秘密时。不要那样做。

      现在,您的情况与我的不同,所以也许它对您有意义,也许它不会。你必须自己弄清楚。

      顺便说一句:在 C# 中,我曾经尝试将单元测试放在一个名为“Tests”的类中,该类嵌套在它正在测试的类中。这使得事情的正确组织变得显而易见。它还避免了当“Foo”类的测试在名为“FooTests”的类中时发生的名称重复。但是,我可以访问的单元测试框架拒绝接受未标记为“公开”的测试。这意味着您正在测试的课程不能是“私人的”。我想不出任何充分的理由要求测试是“公共的”,因为没有人真正将它们称为公共方法——一切都是通过反射来实现的。如果您曾经为 .Net 编写过单元测试框架,请考虑允许非公开测试,看在我的份上!

      【讨论】:

      • 有趣的方法。我完全同意公开测试。愚蠢的要求,IMO。
      • @Kilhoffer:多年来我一直在抱怨这一点,而你是第一个真正同意我的人。谢谢!
      • 如果您在测试类中使用[Conditional("DEBUG")],那么它们不应该出现在生产程序集中并且不会影响性能。
      【解决方案4】:

      我建议不要这么麻烦......如果你真的想对你的“内部”类进行单元测试,只需将它们隐藏在一个只有你的内部代码最终会使用的命名空间中。除非您正在编写一个 .NET 框架规模的框架,否则您真的不需要那种级别的隐藏。

      【讨论】:

        【解决方案5】:

        您可以使用反射(就像 MS 测试项所做的那样),或者您可以将单元测试程序集声明为核心程序集的朋友。

        另一种选择是将单元测试放在同一个程序集中。

        【讨论】:

          猜你喜欢
          • 2010-11-15
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 2014-03-14
          • 1970-01-01
          相关资源
          最近更新 更多