2012-08-09 75 views
4

我希望涵盖非常高的代码覆盖范围,并且要覆盖异常类或让它们从codecoverage报告中排除。如何涵盖PHPUnit中的异常类

示例代码

class My_DataException extends Exception 
{} 

class Foo 
{ 
    function __construct() { throw new My_DataException('see?'); } 
} 

我怎样可以得到My_DataException代码覆盖率(库/我的/ DataException.php)或已经从出现在代码覆盖率报告中排除的文件吗?我不想使用注释方法(@codeCoverageIgnore或类似的东西)。

我phpunit.xml已经定义了黑名单,并没有白名单

<filter> 
    <blacklist> 
     <directory suffix="Exception.php">../library/</directory> 
    </blacklist> 
</filter> 

每个异常文件将在“Exception.php”结束这样的IM不知道为什么后缀部分不工作。

其他细节:

  • 这不是一个关于覆盖
  • 适量我宁愿在每一个异常文件中未使用的标注方法问题
  • 每个异常文件将结束“ Exception.php“例如。我/ Exception.php或我/ DataException.php
+1

什么版本(PHP,Xdebug的,PHPUnit的,PHP的代码覆盖率)您使用的?对于我来说,没有可执行代码的例外不会出现在覆盖报告中。请参阅:https://dl.dropbox.com/u/3615626/stackoverflow/sampleproject-phpunit-code-coverage.tar.gz运行'phpunit --coverage-text'(或html)只显示我一个文件,而不是例外。 – edorian 2012-08-09 22:36:44

+0

PHPUnit 3.6.10。 PHP 5.3.10-1ubuntu3.2,Xdebug v 2.1.3。不确定“php-codeCoverage”一个...不适用? – 2012-08-31 04:55:06

回答

3

对于下面的代码:

class Foo 
{ 
    function __construct() { 
     throw new My_DataException('see?'); 
    } 
}s 

如果执行在测试中该行您将得到的代码覆盖率:

new Foo; 

对于这样一个测试,你可以告诉Phpunit哪一个例外,你期望有一个注释:

/** 
* @expectedException My_DataException 
*/ 

但是,例外通常是例外情况,因此您不会涉及它们,但出于安全原因也可能存在这些例外情况,但您不知道如何使用测试设置/数据/参数触发它们。

然后想一想,试着触发它们。否则,它可能是代码是多余的,因为从技术上讲,你不能抛出异常,因此它是没有必要的。

因为你知道他们可以发生,但你仍然不能引发他们的情况下(这可能吗?),你可以标记你的脚本的某些区域从覆盖报告在源代码中排除:

// @codeCoverageIgnoreStart 
throw new My_DataException('see?'); 
// @codeCoverageIgnoreEnd 

用它稀疏,你可能想在将来删除它。

+0

您对通过其他课程涵盖例外的评论让我想到了。我总是试图做@覆盖Fooclass ::方法,这就是为什么我从来没有得到异常类的覆盖。我可以删除@covers注释来获取引发它们的测试中的异常类的覆盖。 – 2012-08-31 04:51:41

-1

我一直在寻找一种方式来掩盖实际的异常文件,这是我最终得到答案时偶然发现:

<?php 

/** 
* Simple test for exception 
*/ 
class Api_ExceptionTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * Test can construct the exception, then throw it. 
    * 
    * @expectedException Api_Exception 
    */ 
    public function testThrowException() 
    { 
     $exception = new Api_Exception(); 
     throw $exception; 
    } 
}