PHPUnit @expectedException不尊重namesapce导入

时间:2016-03-18 09:49:03

标签: phpunit

我发现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的限制还是我在这里做错了什么?

1 个答案:

答案 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);
    }
}