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

扩展抽象类的类的PHPUnit代码覆盖率,php,phpunit,abstract-class,code-coverage,xdebug,Php,Phpunit,Abstract Class,Code Coverage,Xdebug,我在自定义命名空间中有一个抽象类异常,它没有抽象方法。所有方法都显示为其测试所涵盖(以标准方式模拟)。把它抽象化的原因并不重要 然后我有大约10个类,它们扩展了Exception,但没有添加或覆盖任何方法、属性、常量等。很明显,它们也应该被覆盖,但它们显示为未完全覆盖。我读了文件,在谷歌上搜索了一会儿,但没有找到答案 PHP_CodeCoverage 1.1.3 PHPUnit 3.6.12 PHP 5.4.4 Xdebug 2.2.1-5.4-vc9 虽然使用@codeCoverageIg

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

然后我有大约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:来源

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

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

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

更新

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


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

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

如前所述,您的测试没有实例化
Dict
,因此实际上不包括
Dict
。您需要将模拟对象创建更改为使用
Dict
而不是
\Jade\Core\Base\Exception

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


PHPUnit和PHP_CodeCoverage仅解释Xdebug提供的数据,Xdebug有一些特殊情况,其中非可执行代码被视为可执行代码,包括
if
else
块上的大括号,类声明即使在实例化时也不算作已执行,以及说明在执行文件内容之前和之后不存在的行。如果您可以创建一个最小的测试用例来演示一个真正的问题,请将其发布到。

问题完全是在类自动加载中。为了得到工作,我必须在引导文件中手动包含带有类源的文件。

你能举个例子说明哪些行显示为未包含吗?是类声明还是大括号?谢谢编辑,我添加了源代码和CodeCoverage输出。是的,这是我的错。我尝试了声明以使其按预期工作,但忘记了撤消更改。我修正了这个问题,覆盖率问题没有解决。
\Jade\Core\Exceptions\Dict
在我的
\Jade\Core\Base\Dict
类中内部抛出。此外,我还更新了我的问题,指出将
\Jade\Core\Base\Exception
设置为常规(非抽象)类并没有帮助。实际上,正如我们在示例中看到的,
\Jade\Core\Exceptions\Dict
扩展
\Jade\Core\Base\Exception
,但没有添加新的功能(方法、道具),因此我认为还应该根据
\Jade\Core\Base\Exception
的测试来涵盖它。顺便说一句,当使用名称空间时,我们应该给出完整的类名,名称空间
$stub=$this->getMockForAbstractClass('\Jade\Core\Exceptions\Dict',…)我将尝试创建一个不太复杂的示例来演示问题,正如您所建议的那样-字典
JCBD
会抛出异常
JCED
,但您的测试会创建一个模拟异常,而不是字典。我仍然看不到您的测试调用字典中会导致抛出异常的代码的位置。您的测试甚至声明它们覆盖了基本异常——而不是子异常。您可能对包含异常的字典进行了测试,但我想澄清一下,上面的帖子没有包含包含子异常的代码。因此,问题是
JCED
显示为未包含。是的,不包括在内,因为它没有额外的功能。我认为,如果它的父级
JCBE
完全由它自己的测试覆盖(使用或不使用mock,这没关系,imho)。也许我遗漏了一些要点?看我的重写,但长话短说,你们必须使用一个类来涵盖它。你们能更具体一点吗?举个例子吧?我遇到了同样的问题。我想你现在只能靠自己了,我几乎记不起是什么问题和解决方案了,对不起。
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 {
}
$stub = $this->getMockForAbstractClass('\Jade\Core\Exceptions\Dict', ...);