【问题标题】:Cannot access child property in parent class (calling method inherited from parent in child object)无法访问父类中的子属性(调用从子对象中的父类继承的方法)
【发布时间】:2012-07-13 00:37:28
【问题描述】:

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

<?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());

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

【问题讨论】:

    标签: php zend-framework phpunit


    【解决方案1】:

    这是由 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()

    【讨论】:

    • 谢谢。我会试一试。请给我几天时间来试试这个,如果它有效,我会接受你的回答。这是我的个人项目,我在工作周没有太多时间来处理它;)干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-04-30
    • 2021-05-07
    相关资源
    最近更新 更多