当前位置:  开发笔记 > 编程语言 > 正文

通过System.Reflection访问内部成员?

如何解决《通过System.Reflection访问内部成员?》经验,为你挑选了4个好方法。

我正在尝试对具有许多内部函数的类进行单元测试.这些显然也需要测试,但我的测试项目是分开的,主要是因为它涵盖了许多小的相关项目.到目前为止我所拥有的是:

FieldInfo[] _fields = 
    typeof(ButtonedForm.TitleButton).GetFields(
        BindingFlags.NonPublic | BindingFlags.Instance | 
        BindingFlags.DeclaredOnly);
Console.WriteLine("{0} fields:", _fields.Length);
foreach (FieldInfo fi in _fields)
{
    Console.WriteLine(fi.Name);
}

这很好地吐出了所有私人成员,但仍然没有显示内部.我知道这是可能的,因为当我搞乱Visual Studio可以生成的自动生成的测试时,它询问了如何处理显示Test项目的内部结构.好吧,现在我正在使用NUnit并且非常喜欢它,但是我怎么能用它来实现同样的目的呢?



1> Eric Schoono..:

使用该InternalsVisibleTo属性将组件的内部成员的访问权限授予单元测试程序集更为合适.

这是一个链接,其中包含一些有用的附加信息和演练:

InternalsVisible的奇迹

要实际回答您的问题... .NET Reflection API中无法识别内部和受保护.这是引自 MSDN:

C#关键字protected和internal在IL中没有任何意义,并且不在Reflection API中使用.IL中的相应术语是Family和Assembly.要使用Reflection标识内部方法,请使用IsAssembly属性.要标识受保护的内部方法,请使用IsFamilyOrAssembly.


只是一个FYI,链接到此答案的页面是我的,我的URL已更改.这就是为什么你可能会得到404.尝试这个更新的链接http://jason.whitehorn.ws/2007/11/09/The-Wonders-Of-InternalsVisibleTo.aspx

2> Ash..:

添加 InternalsVisibleTo程序集级别属性到主项目中,使用程序集名称为thre test项目应该使内部成员可见.

例如,在任何类之外的程序集中添加以下内容:

[assembly: InternalsVisibleTo("AssemblyB")]

或者针对更具体的定位:

[assembly:InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

请注意,如果您的应用程序集具有强名称,则还需要强烈命名测试程序集.



3> Mitch Wheat..:

我想你需要问一下你是否应该为私有方法编写单元测试?如果您为公共方法编写单元测试,并且具有"合理的"代码覆盖率,那么您是否已经在测试任何需要调用的私有方法?

将测试绑定到私有方法将使测试更加脆弱.您应该能够在不破坏任何测试的情况下更改任何私有方法的实现.

参考文献:

http://weblogs.asp.net/tgraham/archive/2003/12/31/46984.aspx http://richardsbraindump.blogspot.com/2008/08/should-i-unit-test-private-methods.html http://junit.sourceforge.net/doc/faq/faq.htm#tests_11 http://geekswithblogs.net/geekusconlivus/archive/2006/07/13/85088.aspx



4> Jon Skeet..:

您的代码只显示字段 - 所以我希望它不会显示任何内部成员,因为字段应始终是私有IMO.(可能的常数除外.)

ButtonedForm.TitleButton实际上是否有任何非私有字段?如果您正在尝试查找内部方法,那么显然您需要调用GetMethods(或GetMembers)来获取它们.

正如其他人所建议的那样,InternalsVisibleTo测试非常方便(而且几乎只用于测试!).至于你是否应该测试内部方法 - 我当然觉得能够这样做很有用.我不认为单元测试是专门的黑盒测试.通常当您知道使用以简单方式连接的一些内部方法实现公共功能时,更容易对每个内部方法进行全面测试,并对公共方法进行一些"伪集成"测试.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有