如何将私有方法暴露给单元测试

时间:2013-08-01 15:10:25

标签: c# unit-testing .net-4.0

我正在尝试将我的私有方法暴露给单元测试。我在UnitTesting Succintly中看到了这个例子:

public class DoesSomething
{
#if TEST
    public
#else
    private
#endif
    void SomeComputation() {
    }
}

以下是我的尝试,但在尝试通过测试访问时,代码仍显示为私有。

#if TEST
            public
#else
        private
#endif
        Organization TransformToOrganization(OrgChartOrganizationUnitType org)
        {
            ...
        }

3 个答案:

答案 0 :(得分:14)

您不需要将私有方法公开给您的测试。您的类的 public 方法有一个规范。您的单元测试应该测试您的类的 public 方法是否符合该规范。 公共方法如何做到这一点并不是一个人的事;您希望只要您继续遵守 public 方法的规范,就可以随意更改您的私有实施。

如果您编写依赖于私有实现的单元测试,您最终会得到非常脆弱的单元测试,这些测试实际上并没有添加任何值,因为只有 的东西您需要验证的是公开公开的成员是否遵守其规范。如果在背景中隐藏着小小的小猫,整个过程都有效,那就无所谓了。

答案 1 :(得分:3)

  

我正在尝试将我的私有方法暴露给单元测试。

你不应该。私有方法就是私有方法。它们完全封装在包含它们的类中,而不是该类的外部接口的一部分。单元测试应验证类的外部接口(或外部可见功能),而不是其私有内部实现。

换句话说,为私有方法编写测试会将测试紧密地耦合到这些对象的特定实现。

当私有方法被对象的面向公众的功能使用时,应间接测试私有方法。如果这些测试中没有涉及它们,您有两种选择:

  • 没有测试功能,因此测试不完整。或;
  • 私有方法未被使用,应予删除。

答案 2 :(得分:2)

您必须正确更改TEST编译常量。这不是内置于VS编译常量的内容,可以为调试/发布配置打开/关闭。