我希望我的Core程序集不会暴露某个类,我仍然希望能够测试它。我怎么能这样做?
答案 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框架的规模上编写框架,否则真的不需要这种隐藏级别。