我发现PHPUnit的注释@expectedException
不想从use
语句中读取类命名空间路径(我使用psr-0进行自动加载)。
以此为例:
<?php
namespace Outrace\Battleship\Tests;
use Outrace\Battleship\Collection\MastCollection;
use Outrace\Battleship\Exception\CollectionOverflowException;
class MastCollectionTest extends \PHPUnit_Framework_TestCase
{
/**
* @expectedException CollectionOverflowException
*/
public function testAcceptOnlyMasts()
{
$notMastObject = new \stdClass();
$mastCollection = new MastCollection();
$mastCollection->attach($notMastObject);
}
}
测试运行时会导致此错误:
ReflectionException:类CollectionOverflowException不存在
为了解决这个问题,我尝试将autoload-dev
添加到我的compose.json并再次转储自动加载文件:
"autoload-dev": {
"classmap": [
"src/Outrace/Battleship/Exception/"
]
},
或psr-4:
"autoload-dev": {
"psr-4": {
"Outrace\\Battleship\\Tests\\": "src/Outrace/Battleship/Tests/",
"Outrace\\Battleship\\Exception\\": "src/Outrace/Battleship/Exception/"
}
},
以上都不会解决问题,错误会持续存在。
但是,如果注释引用了异常类的fullu限定名称,那么测试将很有效:
/**
* @expectedException Outrace\Battleship\Exception\CollectionOverflowException
*/
public function testAcceptOnlyMasts()
这是PHPUnit的限制还是我在这里做错了什么?
答案 0 :(得分:2)
这是phpunit如何运作的限制。
在内部,它使用php的ReflectionClass
,它需要异常的FQCN。它只需要在注释中给出它的字符串。
在检查异常$reflector = new ReflectionClass($this->expectedException);
时,TestCase.php具有以下内容,并且通过注释或对expectedException
的调用填充setExpectedException()
属性。
如果您使用setExpectedException()
方法,则可以使用简化名称,然后执行诸如
<?php
namespace Outrace\Battleship\Tests;
use Outrace\Battleship\Collection\MastCollection;
use Outrace\Battleship\Exception\CollectionOverflowException;
class MastCollectionTest extends \PHPUnit_Framework_TestCase
{
public function testAcceptOnlyMasts()
{
$this->setExpectedException(CollectionOverflowException::class);
$notMastObject = new \stdClass();
$mastCollection = new MastCollection();
$mastCollection->attach($notMastObject);
}
}