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

Chi*_*sar 4 .net reflection unit-testing design-patterns accessor

最近为了实现类的私有方法的单元测试,我通过创建私有访问器而不是使用Reflection使用PrivateObject,我收到了以下代码审查注释:

"我对私有对象的主要关注是在构造函数中使用object [].它取代了编译器强制执行的强类型操作和JavaScript式运行时错误检测.因此,个人而言,我不推荐它."

上面的评论让我感到困惑,因为根据我的理解,Reflection也需要object[]调用任何方法.请帮助我了解最佳方法.

Val*_*zub 6

  • 您可以使用通过私有(现在受保护)方法继承类的特殊类,并提供从外部受保护方法调用不可见的公共方法.

这在伟大的书重构测试代码http://xunitpatterns.com/中称为测试特定子类或测试特定扩展

您可以在此处阅读有关测试私有方法的更多详细信息和想法: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
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将此类放置为测试程序集,以便您的实际程序集不包含特定于测试的逻辑和类,因为它的设计很糟糕.

  • 您还可以使用条件编译作为可见性属性,如下所示
    #if DEBUG
        public
    #else
        private
    #endif

在这种情况下,在Debug中,您可以调用单元测试,但在发布时,这些方法将不可见.然而,这种方法比上述方法更糟糕,也更丑陋.

仅仅测试公共接口可能是不够的(通常不是),以便说您获得了良好的测试覆盖率,并且您的代码易于维护和重构.

至于将私有方法标记为内部并且具有测试程序集,由于许多原因,内部方法很糟糕

  1. 您的前私人方法在您的装配中可见,因为它们是内部的
  2. 您将在产品的发布版本中具有测试特定逻辑(这些方法的内部仅用于测试目的),这很糟糕

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