扩展抽象类的类的 PHPUnit 代码覆盖率

标签 php phpunit abstract-class code-coverage xdebug

我在自定义命名空间中有一个抽象类Exception,它没有抽象方法。所有方法都显示为其测试所涵盖的内容(以标准方式模拟)。使其抽象的原因并不重要。

然后我有大约 10 个扩展 Exception 的类,但不添加或重写任何方法、属性、常量等。很明显,所有这些类也应该被覆盖,但它们是显示为未完全覆盖。我阅读了文档并用谷歌搜索了一段时间,但没有找到答案。

  • PHP_CodeCoverage 1.1.3
  • PHPUnit 3.6.12
  • PHP 5.4.4
  • Xdebug 2.2.1-5.4-vc9

虽然使用 @codeCoverageIgnore 进行注释是一种解决方案,但我想找出为什么会发生这种情况,而不是获得 100% 的覆盖率。

UPD:来源。

-------------抽象类----------

namespace Jade\Core\Base;


abstract class Exception extends \Exception {
    /**
     * Additional info for exception
     * @var array|null
     */
    protected $info;

    public function __construct($message, array $info = null, $code = 0, \Exception $previous = null) {
        parent::__construct($message, $code, $previous);
        $this->info = $info;
    }

    /**
     * Get the Exception additional info
     * @return mixed
     */
    public function getInfo() {
        return $this->info;
    }
}

------------- 抽象类测试 ----------

class ExceptionTest extends \PHPUnit_Framework_TestCase {
    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testGetInfo() {
        $info = array('info' => 'test');
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message', $info));

        $this->assertEquals($info, $stub->getInfo());
    }

    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testConstructWithDefaultInfo() {
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message'));
        $this->assertEmpty($stub->getInfo());
    }
}

------------- 扩展抽象类的类 ----------

namespace Jade\Core\Exceptions;


class Dict extends \Jade\Core\Base\Exception {
}

Code coverage tool output

更新

重命名\Jade\Core\Base\Exception以避免与\Exception可能发生冲突并没有帮助(我尝试了\Jade\Core\Base\Ixception)。

将 Exception 类设为常规类,而不是抽象类也没有帮助。

最佳答案

类声明被 Xdebug 视为可执行代码,并且您必须使用该类(上面的“\Jade\Core\Exceptions\Dict”)才能将其显示为已覆盖。由于此类被设计为可实例化,因此您必须使用它创建至少一个对象。

正如发布的那样,您的测试没有实例化 Dict,因此实际上没有涵盖 Dict。您需要更改模拟对象创建以使用 Dict 而不是 \Jade\Core\Base\Exception

$stub = $this->getMockForAbstractClass('\Jade\Core\Exceptions\Dict', ...);

注意

PHPUnit 和 PHP_CodeCoverage 仅解释 Xdebug 提供的数据,其中存在一些极端情况,其中非可执行代码被视为可执行代码,包括 ifelse block 上的右大括号,即使实例化它,类声明也不会被视为已执行,并声明执行文件内容之前和之后不存在的行。如果您可以创建一个最小的测试用例来演示真实问题,请将其发布到 Xdebug's issue tracker .

关于扩展抽象类的类的 PHPUnit 代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013758/

相关文章:

javascript - 单击按钮修改表列数据

php - 如何使 php 脚本删除自身(包括目录)

php - Magento 产品图片未调整大小

php - Phing、Xinc 或 phpUnderControl - 哪一个会持续下去?

php - 当索引已经在 MySQL/PHP 中构建时,防止创建索引

php - 有没有办法创建 Doctrine 2 实体管理器的模拟并在 Symfony 2 PHPUnit 测试中为其提供模拟实体?

php - 单元测试中的依赖关系

java - 不实现抽象类中的方法(并使其不可访问)

java - 继承同一父对象的两个对象交换了属性

C++ 抽象基类构造函数/析构函数 - 一般正确性