单元测试 - 设置私有成员以获得所需的对象状态

Puc*_*tek 9 c++ unit-testing

我正在采取单元测试的第一步,并且有封装问题.我的类有一些不应该对客户端可见的私有成员变量,但为了让我将对象置于我想要测试它的状态,我需要设置这些私有变量.

说我有这样的代码:

Class Foo {

public:
  int action() ;  
private:
  int state ;

} ;

int Foo::action()
{
  if(this->state == 1)
    return 1 ;
  else
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

所以现在我想测试Foo::action(),但我需要能够设置Foo::state能够在不同场景下检查功能.一个解决方案是define private public测试代码中的邪恶" ".但是有更优雅的东西吗?我想强调的是,这Foo::state是一个客户端不应该访问的变量,因此我不想声明任何公共setter.

编辑:

我现在认为扩展我想在测试代码中测试的类并在该派生类中包含setter会起作用,只要我将私有变量更改为protected.但这是一个"仅限一代"的解决方案,仍然感觉像是一个黑客而不是一个正确的方法.

编辑2:

在阅读了答案和评论之后我得到了(特别感谢Lieven和ap.)我相信我现在要测试的实际课程(不是我提供的简单例子)只是做得太多而我的问题的答案正在移动它的一些逻辑进入另一个将由大家伙使用的类.

Lie*_*ers 4

只有两种可能性(重构除外)

\n\n
    \n
  1. 使用公共接口设置状态。
  2. \n
  3. 如果您无法通过公共接口将其设置为该状态,则该状态是多余的。
  4. \n
\n\n

选项 2 是不言自明的,很可能不适用于您的情况,因此您只能通过类的公共接口设置状态。

\n\n

正如您已经提到的,这是可能的,但需要大量代码才能达到正确的状态。这本身可能表明您的类当前做得太多了,是时候将类的部分内容重构为更小的、可测试的类了。

\n\n

来自不要测试私有方法

\n\n
\n

如果您发现需要测试私有方法,那么您\xe2\x80\x99 正在做\n 其他错误。可以这么说,存在一个 \xe2\x80\x9cupstream\xe2\x80\x9d 问题。由于此过程中之前的一些其他错误,您遇到了此问题。尝试准确地隔离它是什么,然后将其删除,而不是让您的测试走上测试脆弱性的痛苦道路。

\n
\n\n

单元测试私人成员

\n\n
\n

我建议不要对私有方法进行单元测试。由于它们是私有的,因此它们可能会在每个版本之间以任何可以想象(或不可想象?)的方式进行更改。如果给定的私有方法对于类的操作如此重要,以至于您认为它值得测试用例,那么可能是时候将其重构为受保护的或公共方法了

\n
\n\n

对此的一个常见引用是

\n\n
\n

你绝对不应该触摸你的私处

\n
\n