81

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

4

5 回答 5

108

InternalsVisibleTo属性来救援!

只需添加:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

到您的核心类 AssemblyInfo.cs 文件

有关最佳实践,请参阅Friend Assemblies(C# 编程指南) 。

于 2008-09-09T13:59:55.380 回答
20

如果您的程序集被强命名,则使用 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

于 2008-09-09T14:17:10.520 回答
9

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

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

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

这是一个安全风险。仅当您的测试中有秘密时。不要那样做。

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

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

于 2008-09-09T15:40:21.177 回答
3

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

于 2008-09-09T14:32:26.177 回答
2

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

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

于 2008-09-09T14:01:33.880 回答