首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过System.Reflection访问内部成员?

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

Stack Overflow用户
提问于 2008-10-05 01:41:23
回答 5查看 17K关注 0票数 24

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

代码语言:javascript
复制
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,我真的很喜欢它,但是我如何用它来实现同样的事情呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-05 01:44:31

使用InternalsVisibleTo属性向您的单元测试程序集授予对程序集内部成员的访问权限更为合适。

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

来回答你的问题..。在.NET反射应用编程接口中不能识别内部和受保护。下面是MSDN的一句话:

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

票数 32
EN

Stack Overflow用户

发布于 2008-10-05 01:44:43

InternalsVisibleTo程序集级属性添加到主项目中,并使用thre测试项目的程序集名称,应该会使内部成员可见。

例如,将以下内容添加到任何类外部的程序集中:

代码语言:javascript
复制
[assembly: InternalsVisibleTo("AssemblyB")]

或者更具体的目标:

代码语言:javascript
复制
[assembly:InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

请注意,如果您的应用程序程序集具有强名称,则测试程序集也需要具有强名称。

票数 6
EN

Stack Overflow用户

发布于 2008-10-05 01:47:13

我认为你需要问一下,你是否应该为私有方法编写单元测试?如果你用“合理的”代码覆盖率为你的公共方法编写单元测试,你不是已经在测试任何需要调用的私有方法了吗?

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

参考文献:

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/171332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档