测试私有变量值

时间:2012-06-20 14:56:31

标签: unit-testing testing automated-tests

好吧,现在不要生气,我知道关于这个话题有几个问题,但我仍有一些疑问。

我认为我完全同意不测试私有函数,我认为这是合理的,但我如何测试设置私有变量的公共方法呢?

假设构造函数设置了一些私有变量,我想测试在调用构造函数后正确设置这些变量。这是一个有效的测试吗?如何在不添加公共getter的情况下检查私有变量的值?

我添加了一个不真实的场景示例,试图更清楚:

public class ClassToTest
{
   private bool _isOn;

   public void SwitchOn() { _isOn = true; }
   public void SwitchOff(){ _isOn = false; }

   public void update()
   {
      if (_isOn)
        DoSomething();
   }

   private void DoSomething()
   {
     //this could also execute a function of an external dependency. But still the dependency could not have a public function to test if the behavior actually ran.
   }
}

如果我无法测试_isOn值,如何测试SwitchOn和SwitchOff是否正常工作? (这是一个例子,它意味着我不会编写一个公共getter,并且函数不会返回值,因为它们不需要)

2 个答案:

答案 0 :(得分:0)

测试应该使用Assemble / Activate / Assert模式:

test switch on {
  x = new ClassToTest();
  x.SwitchOn();   //  <--  Assemble an on switch
  EmptyMailQueue();   // <-- Assemble nothing in the Q

  PossiblySendUserEmail();  // <-- Activate the feature

  assert(mailQueue.count() == 1);
  }

test switch on {
  x = new ClassToTest();
  x.SwitchOff();
  EmptyMailQueue();

  PossiblySendUserEmail();

  assert(mailQueue.count() == 0); // <-- Assert switch is off so no mails sent
  }

您断言您有切换的实际原因。测试交换机本身违反了规则“不要TDD getter和setter”。

答案 1 :(得分:-1)

您需要测试私有成员,因为他们可能有错误。

“私人”不是一个神奇的障碍,它只是一个建议生产代码客户不要直接调用该成员的惯例。

使用_underbar预先添加所有此类成员与使用硬件保护此类方法的C ++一样有用。

你的汽车发动机内部有插头,驾驶时不应该使用插头,只有当机修工检测时才会使用。软件应该是一样的。测试您的私人成员,并在需要时禁用私人。

...然而


对象的意思是暴露行为。如果您的私有变量设置正确,那么您的对象应该正常运行。您的测试应该请求此行为。

查找“测试驱动开发”(并开始使用昨天),然后查找“故意编程”。您的测试用例应该从请求该行为开始,而不应该担心实现细节。如果升级对象以使用不同的内部,则无需进行太多测试。

(不要向精灵或软件方法学家寻求建议,因为他们会说是和否!)