PHP单元测试抽象类中的受保护变量


PHP unit testing protected variables in an abstract class

这是我试图进行单元测试的代码:

public function getDao () {
    $dao = '';
    if (isset($this->_dao)) {
        $dao = $this->_dao;
    } else {
        $dao = new $this->_daoClassName; 
    }
    return $dao;
}

该类是一个抽象类,$_daoClassName是一个受保护的变量。每个具体类为$_daoClassName 设置一个值

如何对该代码进行单元测试?我正在尝试使用PHPUnit的$this->getMockForAbstractClass(),但我认为我无法覆盖受保护的方法。或者,我应该在这个getDao()方法上使用更好的模式吗?

我强烈建议使用这样的函数:

abstract protected function getDaoClassName();

应该通过子类来实现。(通过abstract强制执行)

然后,您可以以函数返回特定值的方式配置mock:

$stub = $this->getMockForAbstractClass('YourClass');
$stub->expects($this->any())
     ->method('getDaoClassName')
     ->will($this->returnValue('SomeDaoClass'));

然后测试方法:

$dao = $stub->getDao();
$this->assertEquals('SomeDaoClass', get_class($dao));