所以这是我的单元测试的父类(简短版本):
<?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?
答案 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()
。