[英]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.