我如何允许assembly(unit testing)来访问另一个assembly的内部属性?

我想我的核心程序集不公开某个类,我仍然希望能够testing它。 我怎样才能做到这一点 ?

InternalsVisibleTo属性来拯救!

只需添加:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")] 

到你的Core类的AssemblyInfo.cs文件

查看好友程序集(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

我把我的unit testing放在与testing代码相同的程序集中。 这对我来说很有意义,因为我认为“testing自己”是一个阶级的特征,还有“初始化自己”和“描述你自己”之类的东西。

我听到了一些反对这种方法,但他们中很less有说服力。

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

这是一个安全风险 。 只有在你的testing中有秘密。 不要这样做。

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

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

您可以使用reflection(如MS Test项目所做的那样),或者可以将unit testingassembly声明为核心assembly的朋友。

另一种select是将unit testing放在同一个程序集中。

我build议不要去这样的麻烦…如果你真的想unit testing你的“内部”类,只要将它们隐藏在只有你的内部代码将最终使用的命名空间。 除非你在.NET框架的规模上编写框架,否则你并不需要这样的隐藏。