如何允许汇编(单元测试一个)访问另一个汇编的内部属性?

时间:2008-09-09 13:58:03

标签: .net unit-testing

我希望我的Core程序集不会暴露某个类,我仍然希望能够测试它。我怎么能这样做?

5 个答案:

答案 0 :(得分:102)

InternalsVisibleTo属于救援!

只需添加:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

到您的Core类AssemblyInfo.cs文件

有关最佳做法,请参阅Friend Assemblies (C# Programming Guide)

答案 1 :(得分: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

答案 2 :(得分:9)

我将我的单元测试放在与它正在测试的代码相同的程序集中。这对我来说很有意义,因为我认为“将自己测试”作为课程的一个特征,以及“初始化自己”和“描述自己”等内容。

我听到过对这种方法的一些反对意见,但很少有人有说服力。

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

存在安全风险。只有在测试中有秘密。不要那样做。

现在,你的情况与我的情况有所不同,所以也许它对你有意义,也许它不会。你必须自己解决这个问题。

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

答案 3 :(得分:2)

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

另一种选择是将单元测试放在同一个组件中。

答案 4 :(得分:2)

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