2012-02-05 58 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