无法访问父类中的子属性(从子对象中的父级继承的调用方法)

时间:2012-02-05 22:25:24

标签: php zend-framework phpunit

所以这是我的单元测试的父类(简短版本):

<?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-&gt; _rawData进行的第二次单元测试表示它使用NULL数据运行。我的代码出了什么问题?看来测试方法无法访问受保护的属性$ this-&gt; _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());

这可以正常工作并输出“Hello”。在我的单元测试数据提供程序的任何想法都返回NULL?

1 个答案:

答案 0 :(得分: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()