首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPUnit @expectedException不尊重名称does导入

PHPUnit @expectedException不尊重名称does导入
EN

Stack Overflow用户
提问于 2016-03-18 09:49:03
回答 1查看 371关注 0票数 2

我发现PHPUnit的注释@expectedException不希望从use语句中读取类命名空间路径(我使用psr-0进行自动加载)。

以这为例:

代码语言:javascript
复制
<?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文件:

代码语言:javascript
复制
"autoload-dev": {
  "classmap": [
    "src/Outrace/Battleship/Exception/"
  ]
},

或者是psr-4:

代码语言:javascript
复制
"autoload-dev": {
  "psr-4": {
    "Outrace\\Battleship\\Tests\\": "src/Outrace/Battleship/Tests/",
    "Outrace\\Battleship\\Exception\\": "src/Outrace/Battleship/Exception/"
  }
},

以上任何一项都无法解决问题,错误将持续存在。

但是,如果注释引用异常类的富勒限定名,则测试将运行良好:

代码语言:javascript
复制
/**
 * @expectedException Outrace\Battleship\Exception\CollectionOverflowException
 */
public function testAcceptOnlyMasts()

这是PHPUnit的限制,还是我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-03-18 10:08:04

这是phpunit工作方式的一个限制。

在内部,它使用php的ReflectionClass,它期望异常的FQCN。它只需要你在注释中给它的字符串。

TestCase.php在检查异常时,$reflector = new ReflectionClass($this->expectedException);expectedException属性都是从注释或对setExpectedException()的调用中填充的。

如果使用setExpectedException()方法,则可以使用简化的名称,然后可以执行以下操作

代码语言:javascript
复制
<?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);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36081107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档