.net - 在 .NET 中对私有(private)方法进行单元测试的最佳实践是什么?

标签 .net unit-testing design-patterns reflection accessor

最近为了实现一个类的私有(private)方法的单元测试,我使用了的PrivateObject。创建私有(private)访问器而不是使用反射 ,我收到了以下代码审查评论:

"My main concern with Private Object is the use of object[] in constructor. It replaces strong typing enforced by compiler with JavaScript-style run-time error detection.Consequently , personally, I would not recommend it."



上面的这条评论让我很困惑,因为根据我的理解,Reflection 也需要 object[]调用任何方法。请帮助我了解最好的方法是什么。

最佳答案

  • 您可以使用特殊的类
    用私有(private)继承类(现在
    protected) 方法并提供公共(public)
    调用不可见的方法
    外部 protected 方法。

  • 这在伟大的书籍 Refactoring Test Code http://xunitpatterns.com/ 中称为测试特定子类或测试特定扩展

    你可以在这里阅读更多关于测试私有(private)方法的细节和想法:http://xunitpatterns.com/Test-Specific%20Subclass.html

    它像
    public TestClass : RealClass
    {
        public int  CallHiddenCalculate()
        {
            return  Calculate(); // Calculate is now protected method that we expose for test purposes in this class
        }
    }
    

    你可以放置这个类来测试程序集,这样你的真实程序集就不会包含测试特定的逻辑和类,因为它的设计不好。
  • 您还可以对可见性属性使用条件编译,如下所示

  • #如果调试
    上市
    #别的
    私有(private)的
    #万一

    在这种情况下,在 Debug 中您可以调用单元测试,但在发布时这些方法将不可见。
    然而,这种方法比上述方法差得多,也更难看。

    仅仅测试公共(public)接口(interface)很容易不够(而且通常不是),以说明您获得了良好的测试覆盖率并且您的代码易于维护和重构。

    至于将私有(private)方法标记为内部方法并让测试程序集看到内部方法是不好的,原因有很多
  • 你的前私有(private)方法是可见的
    从您的组装开始,因为它们是
    内部
  • 你将有测试特定的逻辑
    (这些方法的内部将
    仅用于测试目的)在
    您的产品的发布版本,
    哪个不好

  • 我认为还有更多,但这些是最重要的

    关于.net - 在 .NET 中对私有(private)方法进行单元测试的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087413/

    相关文章:

    testing - 是否有明确的软件可伸缩性测试模式?

    java - 单例设计模式 : Pitfalls

    haskell - 请帮助我理解 haskell 中的模式匹配。我有点困惑

    c# - 自定义用户控件中的 ASP 嵌套标记

    .net - 在 Newtonsoft.Json 库中获取原始 json 字符串

    .net - 为什么不推荐在 C# 中使用默认编码?

    c# - 处理程序映射的嵌套 WebAPI 问题(继承问题?)

    c++ - Visual Studio 2015 未运行 C++ 单元测试

    c# - 如何使用一次性设置?

    java - 如何使使用全局动态属性的代码可进行单元测试?