2008-12-11 68 views
284

我是新的单元测试,我试图弄清楚是否应该开始使用更多的“内部”访问修饰符。我知道,如果我们使用'internal'并设置程序集变量'InternalsVisibleTo',我们可以测试我们不想从测试项目中公开声明的函数。这使我认为我应该总是使用'​​内部',因为至少每个项目(应该?)都有自己的测试项目。你们可以告诉我为什么我不应该这样做吗?我应该何时使用'私人'?C#“内部”访问修饰符做单元测试时

+0

值得一提 - 你可以通过在方法本身内使用System.Diagnostics.Debug.Assert()来经常避免单元测试你的内部方法。 – 2017-03-30 02:32:34

回答

867

内部类需要进行测试,并且有一个assemby属性:

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("MyTests")] 

这个添加到项目信息的文件,例如Properties\AssemblyInfo.cs

8

您也可以使用私有方法,您可以使用反射调用私有方法。如果您使用的是Visual Studio Team Suite,它具有一些很好的功能,可以生成代理来为您调用私有方法。下面是演示如何做自己的单元测试private和protected方法的工作代码项目的文章:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

在其中的访问修饰符,你应该使用方面,我的一般经验法则是开始与私人并根据需要升级。这样一来,您将尽可能少地暴露出真正需要的类的内部细节,并有助于将实现细节隐藏起来,因为它们应该是。

93

如果要测试私有方法,请在Microsoft.VisualStudio.TestTools.UnitTesting命名空间中查看PrivateObjectPrivateType。他们围绕必要的反射代码提供易于使用的包装。

文档: PrivateTypePrivateObject

+6

当投下时请留下评论。谢谢。 – 2012-07-30 16:44:02

+26

这是愚蠢的投票下来这个答案。它指向一种新的解决方案,并且是以前没有提到过的一个很好的解决方案 – 2012-09-06 07:43:13

8

继续使用默认私人。如果一个成员不应该暴露在这种类型之外,那么它就不应该暴露在这种类型之外,即使是在同一个项目中。这使得事情变得更加安全和整洁 - 当你使用这个对象的时候,更清楚你可以使用哪些方法。

话虽如此,我认为有时候为了测试目的而自然而私有的方法是合理的。我更喜欢使用反射,这是重构不友好的。

有一点要考虑可能是一个“ForTest”后缀:

internal void DoThisForTest(string name) 
{ 
    DoThis(name); 
} 

private void DoThis(string name) 
{ 
    // Real implementation 
} 

然后,当你使用同一个项目中的类,这是明显的(现在和将来),你不应该真的在使用这种方法 - 它仅用于测试目的。这有点冒险,而不是我自己做的事情,但至少值得考虑。

+1

如果该方法是内部的,这是否不妨碍其在测试组件中的使用? – 2010-02-22 15:47:42