我希望我的核心程序集不公开某个类,并且我仍然希望能够对其进行测试。我怎样才能做到这一点 ?
5 回答
InternalsVisibleTo属性来救援!
只需添加:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
到您的核心类 AssemblyInfo.cs 文件
有关最佳实践,请参阅Friend Assemblies(C# 编程指南) 。
如果您的程序集被强命名,则使用 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 编写过单元测试框架,请考虑允许非公开测试,看在我的份上!
我建议不要这么麻烦......如果你真的想对你的“内部”类进行单元测试,只需将它们隐藏在一个只有你的内部代码最终会使用的命名空间中。除非您正在编写一个 .NET 框架规模的框架,否则您实际上并不需要那种级别的隐藏。
您可以使用反射(就像 MS 测试项所做的那样),或者您可以将单元测试程序集声明为核心程序集的朋友。
另一种选择是将单元测试放在同一个程序集中。