【发布时间】:2010-09-08 07:02:33
【问题描述】:
我希望我的核心程序集不公开某个类,并且我仍然希望能够对其进行测试。我该怎么做?
【问题讨论】:
标签: .net unit-testing
我希望我的核心程序集不公开某个类,并且我仍然希望能够对其进行测试。我该怎么做?
【问题讨论】:
标签: .net unit-testing
InternalsVisibleTo 属性来救援!
只需添加:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
到您的核心类 AssemblyInfo.cs 文件
请参阅 Friend Assemblies (C# Programming Guide) 了解最佳做法。
【讨论】:
使用 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
【讨论】:
我将单元测试与其正在测试的代码放在同一个程序集中。这对我来说很有意义,因为我认为“测试自己”是一个类的一个特征,以及“初始化自己”和“描述自己”之类的东西。
我听到了一些反对这种方法的声音,但其中很少有人能令人信服。
这会损害性能 呸,我说!没有硬数据就不要优化!也许如果您计划通过慢速链接下载程序集,那么最小化程序集大小是值得的。
存在安全风险。仅当您的测试中有秘密时。不要那样做。
现在,您的情况与我的不同,所以也许它对您有意义,也许它不会。你必须自己弄清楚。
顺便说一句:在 C# 中,我曾经尝试将单元测试放在一个名为“Tests”的类中,该类嵌套在它正在测试的类中。这使得事情的正确组织变得显而易见。它还避免了当“Foo”类的测试在名为“FooTests”的类中时发生的名称重复。但是,我可以访问的单元测试框架拒绝接受未标记为“公开”的测试。这意味着您正在测试的课程不能是“私人的”。我想不出任何充分的理由要求测试是“公共的”,因为没有人真正将它们称为公共方法——一切都是通过反射来实现的。如果您曾经为 .Net 编写过单元测试框架,请考虑允许非公开测试,看在我的份上!
【讨论】:
[Conditional("DEBUG")],那么它们不应该出现在生产程序集中并且不会影响性能。
我建议不要这么麻烦......如果你真的想对你的“内部”类进行单元测试,只需将它们隐藏在一个只有你的内部代码最终会使用的命名空间中。除非您正在编写一个 .NET 框架规模的框架,否则您真的不需要那种级别的隐藏。
【讨论】:
您可以使用反射(就像 MS 测试项所做的那样),或者您可以将单元测试程序集声明为核心程序集的朋友。
另一种选择是将单元测试放在同一个程序集中。
【讨论】: