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


Answers:


107

InternalsVisibleTo归功于救援!

只需添加:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

到您的核心类AssemblyInfo.cs文件

有关最佳做法,请参见“朋友程序集”(C#编程指南)


3
按照aku链接的指导,我刚刚用一个强大的命名程序集成功地做到了这一点。我确实有一个问题。完成所有配置后,我必须重新启动Visual Studio以使Intellisense正常工作。它会在重新启动之前进行编译,但始终显示红线。
Eric Sc​​hoonover,

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


9

我将单元测试与要测试的代码放在同一程序集中。这对我来说很有意义,因为我认为“测试自己”是班级的特色,还有“初始化自己”和“描述自己”之类的东西。

我听说过有人反对这种方法,但很少有人对此有说服力。

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

这是安全隐患。仅当您在测试中有秘密时。不要那样做

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

另外:在C#中,我曾经尝试将单元测试放在名为“ Tests”的类中,该类嵌套在它正在测试的类中。这使事物的正确组织变得显而易见。它还避免了在对名为“ Foo”的类的测试位于名为“ FooTests”的类中时发生的名称重复。但是,我可以使用的单元测试框架拒绝接受未标记为“公共”的测试。这意味着您正在测试的类不能是“私有”的。我想不出有什么充分的理由要求测试必须“公开”,因为没有人真正将其称为公开方法-一切都是通过反思。如果您曾经为.Net编写过单元测试框架,请考虑允许进行非公开测试,对我而言!


5
有趣的方法。我完全同意测试是公开的。愚蠢的要求,IMO。
Kilhoffer

@Kilhoffer:多年来我一直在抱怨,而你是第一个真正同意我的人。谢谢!
杰伊·巴祖兹

6
如果[Conditional("DEBUG")]在测试类上使用,则它们不应出现在生产程序集中,并且不会损害性能。
xmedeko

3

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


当我在底部注意到您的评论时,我正要评论您的发言。+1!:)
Bjorn Reppen

2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.