2012-02-05 59 views
1

所以这是我的单元测试(精简版)的父类:不能在父类访问子属性(调用方法从子对象的父继承)

<?php 
class TestCaseAbstract extends PHPUnit_Framework_TestCase 
{ 
    protected $_rawPostData; 

    public function setUp() 
    { 
     // ... 
    } 

    /** 
    * 
    * @dataProvider provider 
    */ 
    public function testFoo($rawData) 
    { 
     // ... 
    } 

    public function provider() 
    { 
     return array(
      array(''), 
      array($this->_rawData), 
     ); 
    } 

    public function tearDown() 
    { 
     // ... 
    } 
} 

这是我的子类,实际单位测试用例:

class FooTestCase extends TestCaseAbstract 
{ 
    public function setUp() 
    { 
     $this->_rawPostData = '<?xml version="1.0"?><request><bogus /></request>'; 

     parent::setUp(); 
    } 
} 

现在,当我运行单元测试情况:

.phpunit --debug FooTestCase.php 

我得到这个:

. 
Starting test 'FooTestCase::testFoo with data set #0 ('')'. 
. 
Starting test 'FooTestCase::testFoo with data set #1 (NULL)'. 
. 

正如您所看到的,第二个单元测试数据$ this - > _ rawData表示它使用NULL数据运行。我的代码有什么问题?看来测试方法不能访问受保护的属性$ this - > _ rawData。


我希望我的继承模型不会混乱。我做了一个快速测试只是为了确保在PHP传承工作,因为我觉得它的工作原理:

<?php 

class ParentClass 
{ 
    protected $_property; 

    public function getProperty() 
    { 
     return $this->_property; 
    } 
} 

class ChildClass extends ParentClass 
{ 
    public function __construct() 
    { 
     $this->_property = 'Hello'; 
    } 
} 

$childClass = new ChildClass(); 
var_dump($childClass->getProperty()); 

这个工作并输出“你好”,因为它应该。任何想法为什么在我的单元测试数据提供程序返回NULL?

回答

3

这是由PHPUnit处理数据提供者方法的方式引起的。在任何测试开始之前,每个提供者方法都会使用新的测试用例实例执行一次。这是为了让它得到准确的测试计数。

但是,setUp()而不是在数据提供者方法之前调用。您可以通过添加一个方法来返回提供者方法可以调用的所需数据。将这个新方法定义为基类中的抽象方法,并在子类中覆盖它。另外,不要忘记让你的基类抽象。

abstract class TestCaseAbstract extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testFoo($rawPostData) 
    { 
     // ... 
    } 

    public function provider() 
    { 
     return array(
      array(''), 
      array($this->_getRawPostData()), 
     ); 
    } 

    protected abstract function _getRawPostData(); 
} 

class FooTestCase extends TestCaseAbstract 
{ 
    protected function _getRawPostData() 
    { 
     return '<?xml version="1.0"?><request><bogus /></request>'; 
    } 
} 

更新:我写了一个小的测试案例来验证的PHPUnit不前的数据提供方法调用setUp()

+0

谢谢。我会试一试。请给我几天时间来尝试一下,如果它有效,我会接受你的答案。这是我的个人项目,在工作周期间我没有太多时间来处理它;)干杯。 – 2012-02-06 22:46:33