我是新的单元测试,我试图弄清楚是否应该开始使用更多的“内部”访问修饰符。我知道,如果我们使用'internal'并设置程序集变量'InternalsVisibleTo',我们可以测试我们不想从测试项目中公开声明的函数。这使我认为我应该总是使用'内部',因为至少每个项目(应该?)都有自己的测试项目。你们可以告诉我为什么我不应该这样做吗?我应该何时使用'私人'?C#“内部”访问修饰符做单元测试时
回答
内部类需要进行测试,并且有一个assemby属性:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
这个添加到项目信息的文件,例如Properties\AssemblyInfo.cs
。
您也可以使用私有方法,您可以使用反射调用私有方法。如果您使用的是Visual Studio Team Suite,它具有一些很好的功能,可以生成代理来为您调用私有方法。下面是演示如何做自己的单元测试private和protected方法的工作代码项目的文章:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
在其中的访问修饰符,你应该使用方面,我的一般经验法则是开始与私人并根据需要升级。这样一来,您将尽可能少地暴露出真正需要的类的内部细节,并有助于将实现细节隐藏起来,因为它们应该是。
如果要测试私有方法,请在Microsoft.VisualStudio.TestTools.UnitTesting
命名空间中查看PrivateObject
和PrivateType
。他们围绕必要的反射代码提供易于使用的包装。
当投下时请留下评论。谢谢。 – 2012-07-30 16:44:02
这是愚蠢的投票下来这个答案。它指向一种新的解决方案,并且是以前没有提到过的一个很好的解决方案 – 2012-09-06 07:43:13
继续使用默认私人。如果一个成员不应该暴露在这种类型之外,那么它就不应该暴露在这种类型之外,即使是在同一个项目中。这使得事情变得更加安全和整洁 - 当你使用这个对象的时候,更清楚你可以使用哪些方法。
话虽如此,我认为有时候为了测试目的而自然而私有的方法是合理的。我更喜欢使用反射,这是重构不友好的。
有一点要考虑可能是一个“ForTest”后缀:
internal void DoThisForTest(string name)
{
DoThis(name);
}
private void DoThis(string name)
{
// Real implementation
}
然后,当你使用同一个项目中的类,这是明显的(现在和将来),你不应该真的在使用这种方法 - 它仅用于测试目的。这有点冒险,而不是我自己做的事情,但至少值得考虑。
如果该方法是内部的,这是否不妨碍其在测试组件中的使用? – 2010-02-22 15:47:42
- 1. 内部访问修饰符
- 2. C#内部访问修饰符
- 3. Doxygen与C#内部访问修饰符
- 4. 访问修饰符C# - 内部修饰符
- 5. OO中的单元测试和访问修饰符
- 6. c#访问修饰符部分像C++
- 7. 访问修饰符的内部类
- 8. 关于C#中的内部访问修饰符
- 9. C++子类访问修饰符?
- 10. C#访问修饰符与传承
- 11. c#winform控件访问修饰符
- 12. C++继承与访问修饰符
- 13. System.Reflection.BindingFlags.Instance对应于C#访问修饰符
- 14. 访问修饰符“protected private”在visual C++中做什么?
- 15. Delphi访问修饰符
- 16. 库级访问修饰符
- 17. EventInfo访问修饰符
- 18. 动态访问修饰符
- 19. 练习访问修饰符
- 20. 类访问修饰符
- 21. 保护访问修饰符
- 22. 通过访问修饰符
- 23. 包访问(protected修饰符)
- 24. 测试所有级别的访问修饰符控制
- 25. 没有修饰语法跳过单元测试的测试
- 26. Python单元测试:unterstand修饰器问题
- 27. 单元测试数据访问层c#
- 28. .Net程序集和内部访问修饰符的使用
- 29. 内部类访问修饰符不起作用?
- 30. 如何ReSharper的(R#)更改默认访问修饰符内部
值得一提 - 你可以通过在方法本身内使用System.Diagnostics.Debug.Assert()来经常避免单元测试你的内部方法。 – 2017-03-30 02:32:34