0

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

我认为我完全同意不测试私有函数,我觉得这很合理,但是我怎样才能测试设置私有变量的公共方法呢?

假设构造函数设置了一些私有变量,我想在调用构造函数后测试这些变量是否正确设置。这是一个有效的测试吗?我应该如何在不添加公共 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 并且函数不会返回值,因为它们不需要)

4

2 回答 2

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 getters and setters”的规则。

于 2012-06-20T15:41:19.390 回答
-1

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

“私人”不是魔法障碍,它只是一种建议生产代码客户不要直接调用该成员的约定。

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

你的汽车引擎里面有插头,开车时不应该使用,只有在机械师测试东西时才可以使用。软件应该是一样的。测试您的私人成员,并在需要时禁用私人成员。

然而...


对象的意义在于暴露行为。如果您的私有变量设置正确,那么您的对象应该表现正确。您的测试应该要求这种行为。

查找“Test-Driven Development”(昨天开始使用它),然后查找“Intentional Programming”。您的测试用例应该从请求该行为开始,并且不应该担心实现细节。如果你升级一个对象以使用不同的内部结构,你不需要太多的测试无缘无故地中断。

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

于 2012-06-20T15:13:28.187 回答