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