簡體   English   中英

無法訪問父類中的子屬性(從子對象中的父類繼承的調用方法)

[英]Cannot access child property in parent class (calling method inherited from parent in child object)

這是我用於單元測試的父類(簡短版本):

<?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?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM