关于.net:如何允许程序集(一个单元测试)访问另一个程序集的内部属性?

关于.net:如何允许程序集(一个单元测试)访问另一个程序集的内部属性?

How do I allow assembly (unit testing one) to access internal properties of another assembly?

我希望我的Core程序集不公开某个类,而我仍然希望能够对其进行测试。 我怎样才能做到这一点 ?


InternalsVisibleTo归功于救援!

只需添加:

1
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

到您的核心类AssemblyInfo.cs文件

有关最佳实践,请参见Friend程序集(C#编程指南)。


如果您的程序集是重命名的,则使用InternalsVisible,例如,您需要指定公共密钥(注意:完整密钥而不是公共密钥令牌)...

1
2
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
  PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]

而以下技巧对于在不诉诸cmd行的情况下获取公钥确实很有用...

http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx


我将单元测试与要测试的代码放在同一程序集中。这对我来说很有意义,因为我认为"测试自己"是班级的功能,同时也包括"初始化自己"和"描述自己"之类的东西。

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

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

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

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

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


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


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

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


推荐阅读

    linux命令下访问页面?

    linux命令下访问页面?,系统,数据,传播,网址,环境,密码,信息,地址,软件,工作,l

    linux访问网站的命令?

    linux访问网站的命令?,地址,系统,服务,工作,网站,命令,网络,管理,信息,网址,L

    linux访问模板命令?

    linux访问模板命令?,工作,地址,系统,信息,管理,命令,目录,发行,设备,文件,lin

    命令访问linux系统?

    命令访问linux系统?,系统,地址,信息,软件,命令,时间,工具,网络,管理,电脑,lin

    linux命令查看包属性?

    linux命令查看包属性?,时间,系统,信息,状态,命令,文件,通讯录,管理,情况,标

    linux命令访问网页?

    linux命令访问网页?,地址,传播,网络,系统,软件,网址,密码,服务,数据,首次,lin

    linux访问日志的命令?

    linux访问日志的命令?,系统,信息,对比,实时,基础,日志,命令,文件,设备,管理,l

    linux网页访问命令?

    linux网页访问命令?,地址,网络,工作,系统,命令,传播,信息,软件,代码,首次,在L

    linux访问日志命令?

    linux访问日志命令?,系统,信息,对比,日志,简介,管理,情况,实时,命令,文件,查

    linux访问d盘命令?

    linux访问d盘命令?,系统,管理,电脑,设备,软件,概念,信息,分区,文件,命令,...6

    linux文件访问命令行?

    linux文件访问命令行?,系统,地址,工作,图片,命令,标准,名称,情况,官方网站,

    linux客户访问命令?

    linux客户访问命令?,网络,系统,地址,服务,管理,信息,数字,基础,密码,命令,Lin

    linux访问路径命令?

    linux访问路径命令?,工作,系统,名称,地址,信息,命令,工具,名字,目录,文件,在l

    cd是linux内部命令?

    cd是linux内部命令?,工作,系统,一致,命令,传播,目录,根目录,缩写,用户,上级,l

    linux访问磁盘命令?

    linux访问磁盘命令?,系统,情况,地址,命令,信息,服务,工作,设备,工具,第三,lin

    linux中的内部命令?

    linux中的内部命令?,系统,软件,盘中,命令,外部,内存,内部,目录,功能,文件,lin

    linux脚本内部命令?

    linux脚本内部命令?,系统,命令,状态,软件,盘中,数据,多地,名称,实时,进程,lin

    linux命令有哪些内部?

    linux命令有哪些内部?,系统,命令,信息,工作,软件,盘中,地址,时间,管理,工具,

    linux访问命令缩写?

    linux访问命令缩写?,工作,系统,地址,汽车,服务,网络,管理,命令,信息,目录,Lin

    linux访问客户机命令?

    linux访问客户机命令?,系统,信息,网络,软件,名称,地址,管理,工具,设备,服务,