C#“内部”访问修饰符进行unit testing时
我是新的unit testing,我试图找出是否应该开始使用更多的“内部”访问修饰符。 我知道,如果我们使用'internal'并设置程序集variables'InternalsVisibleTo',我们可以testing我们不想从testing项目中公开声明的函数。 这使我认为我应该总是使用“内部”,因为至less每个项目(应该?)都有自己的testing项目。 你们能告诉我为什么我不应该这样做吗? 我应该什么时候使用“私人”?
内部类需要testing,并有一个集合属性:
using System.Runtime.CompilerServices; [assembly:InternalsVisibleTo("MyTests")]
将其添加到项目信息文件中,例如Properties\AssemblyInfo.cs
。
如果要testing私有方法,请查看Microsoft.VisualStudio.TestTools.UnitTesting
命名空间中的PrivateObject
和PrivateType
。 他们围绕必要的reflection代码提供易用的包装。
文档: PrivateType , PrivateObject
你也可以使用私有方法,你可以通过reflection来调用私有方法。 如果您使用的是Visual Studio Team Suite,它具有一些很好的function,可以生成代理来为您调用私有方法。 下面是一个代码项目文章,演示如何自己完成工作来testing私有和受保护的方法:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
根据您应该使用的访问修饰符,我的一般经验法则是从私有开始,根据需要升级。 这样你就可以尽可能less地暴露出真正需要的类的内部细节,这有助于保持实现细节的隐藏。
继续使用私有默认。 如果一个成员不应该暴露在这种types之外,那么就不应该暴露在这种types之外,即使是在同一个项目中。 这使得事情变得更加安全和整洁 – 当你使用这个对象的时候,更清楚你可以使用哪些方法。
话虽如此,我认为自然私人的方法有时候是为了testing目的而内部合理的。 我更喜欢使用reflection,这是重构不友好的。
有一件事要考虑可能是一个“ForTest”的后缀:
internal void DoThisForTest(string name) { DoThis(name); } private void DoThis(string name) { // Real implementation }
那么当你在同一个项目中使用这个类时,很明显(现在和将来)你不应该真正使用这个方法 – 它只是出于testing的目的。 这有点冒险,而不是我自己做的,但至less值得考虑。