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

时间:2012-08-17 22:02:07

标签: 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类成为常规类,而不是抽象类也没有帮助。

2 个答案:

答案 0 :(得分:1)

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

发布后,您的测试未实例化Dict,因此Dict实际上并未涵盖。您需要将模拟对象创建更改为使用Dict而不是\Jade\Core\Base\Exception

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

注意

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

答案 1 :(得分:1)

问题完全在类自动加载中。为了获得工作,我必须在bootstrap文件中手动包含具有类源的文件。