0

可能重复:
使用 PHPUnit 测试受保护方法的最佳实践

class Footer
{
  private $_isEnabled;

  public function __construct(){
    $this->_isEnabled = true;
  }

  public function disable(){
    $this->_isEnabled = false;
  }  
}

当我在设置_isEanabled为 false 后为禁用功能编写单元测试时,我想断言它是否为 false。

但是我怎样才能访问$_isEnabled

这是我的测试功能:

public function testDisable(){
  $footer = new Footer();
  $footer->disable();
  $this->assertFalse($footer->_isEnable);
}
4

3 回答 3

2

简短的回答:

你不能。这就是私人的意思...

长答案:

您可以使用反射来做到这一点:

http://php.net/manual/en/book.reflection.php

但是,它有点复杂,并且添加了另一个容易失败的层,因此它不是测试的最佳方式......

我更喜欢创建一个 getter 函数:

public function getEnabled() {
   return $this->_isEnabled;
}

但是,如果您还没有做到那么简单,我认为您不想创建它……但是考虑到其他选择,您可能会重新考虑它。

于 2012-07-01T18:52:52.023 回答
1

一个可访问的属性必须是公共的,我认为这是不言自明的。但是,您可能会遇到一些代码,其中受保护和私有属性似乎可以通过类似于访问公共变量的方式访问。

这是使用魔术 getter 方法完成的:

class Footer
{
    private $_isEnabled;

    public function __get($propName)
    {
        if (!isset($this->{$propName}))
        {
            throw new Exception($propName.' is not set');
        }
        return $this->{$propName};
    }
}

每次您尝试访问不存在或不公开的属性时,都会调用此魔术方法。简而言之:

$instance->_isEnabled;//will work.

您可以根据需要更改此方法,例如,不再需要下划线......您可以用它做很多事情。
请参阅手册页

于 2012-07-01T19:16:22.127 回答
1

我怀疑由此获得积分:该课程不是“代数”完整的。Apublic function isEnabled()不见了。如果单元测试没有关于状态的信息,那么其他类客户端也会错过这个信息。

对私有内容的单元测试无助于在公共 API 上说明任何内容,但会检查应该很明显的内部操作。

一般来说,依赖于实现的单元测试是一件坏事;然后重新实现也使得维护单元测试。

于 2012-07-01T19:38:12.447 回答