我在自定义命名空间中有一个抽象类Exception
,它没有抽象方法。所有方法都显示为其测试所涵盖(以标准方式模拟)。使其抽象化的原因并不重要。
然后我有大约10个扩展Exception
但没有添加或覆盖任何方法,属性,常量等的类。很明显,所有这些类都应该被覆盖,但它们显示为不完全覆盖。我阅读了文档并用谷歌搜索了一段时间但没有找到答案。
虽然使用@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 {
}
更新
重命名\Jade\Core\Base\Exception
以避免与\ Exception发生可能的冲突没有帮助(我试过\Jade\Core\Base\Ixception
)。
使Exception类成为常规类,而不是抽象类也没有帮助。
答案 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提供的数据,其中有一些极端情况,其中非可执行代码被视为可执行,包括if
和else
块上的紧密括号,类声明未计算即使在实例化时也执行,并指出执行文件内容之前和之后不存在的行。如果您可以创建一个最小的测试用例来演示真正的问题,请将其发布到Xdebug's issue tracker。
答案 1 :(得分:1)
问题完全在类自动加载中。为了获得工作,我必须在bootstrap文件中手动包含具有类源的文件。