如何允许装配体(一个单元测试)访问另一个装配体的内部属性?
我希望我的Core程序集不公开某个类,而我仍然希望能够对其进行测试。我怎样才能做到这一点 ?
解决方案
回答
InternalsVisibleTo归功于救援!
只需添加:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
到核心类AssemblyInfo.cs文件
有关最佳做法,请参见"朋友程序集"(C编程指南)。
回答
我们可以使用反射(就像MS测试项目一样),也可以将单元测试程序集声明为核心程序集的朋友。
另一个选择是将单元测试放在同一程序集中。
回答
如果程序集是重命名的,则使用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
回答
我建议不要麻烦……如果我们真的想对"内部"类进行单元测试,只需将它们隐藏在仅内部代码最终会使用的命名空间中即可。除非我们编写的是.NET框架规模的框架,否则我们实际上并不需要这种隐藏级别。
回答
我将单元测试与要测试的代码放在同一程序集中。这对我来说很有意义,因为我认为"测试自己"是班级的特色,还有"初始化自己"和"描述自己"之类的东西。
我听说过有人反对这种方法,但很少有人对此有说服力。
我说,这伤害了性能Bah!没有硬数据就不要优化!也许,如果我们计划通过慢速链接下载程序集,那么使程序集大小最小化将是值得的。
这是安全隐患。仅当我们在测试中有秘密时。不要那样做
现在,情况与我的情况不同,因此也许对我们有意义,也许不会。我们必须自己弄清楚。
另外:在C#中,我曾经尝试将单元测试放在名为" Tests"的类中,该类嵌套在要测试的类中。这使事物的正确组织变得显而易见。它还避免了在对名为" Foo"的类的测试位于类" FooTests"中时发生的名称重复。但是,我可以访问的单元测试框架拒绝接受未标记为"公共"的测试。这意味着我们正在测试的类不能是"私有的"。我想不出有什么充分的理由要求测试必须是"公开的",因为没有人真正将它们称为公开方法,这一切都是通过反思实现的。如果我们曾经编写过.Net的单元测试框架,请考虑允许我进行非公开测试!