如何在PHPUnit中覆盖异常类

时间:2012-08-09 18:58:23

标签: php phpunit code-coverage

我的目标是获得非常高的代码覆盖率,并希望覆盖异常类或将它们排除在codecoverage报告之外。

示例代码

class My_DataException extends Exception
{}

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

如何在My_DataException(在library / My / DataException.php中)获取代码覆盖率,或者将文件排除在代码覆盖率报告中?我不想使用注释方法(@codeCoverageIgnore或类似的东西)。

我的phpunit.xml定义了黑名单,没有白名单

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

每个Exception文件都以“Exception.php”结尾,所以我不确定为什么后缀部分不起作用。

其他详情:

  • 这不是关于适当覆盖范围的问题
  • 我宁愿不在每个Exception文件中使用注释方法
  • 每个异常文件将以“Exception.php”结尾,例如。 My / Exception.php或My / DataException.php

2 个答案:

答案 0 :(得分:3)

以下代码:

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

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

new Foo;

对于这样的测试,您可以通过注释告诉Phpunit您期望哪个例外:

/**
 * @expectedException My_DataException
 */

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

然后更加努力并尝试触发它们。否则可能是代码是多余的,因为从技术上讲,你无法抛出异常,因此没有必要。

对于你知道它们可能会发生的情况,但是你仍然无法触发它们(这可能吗?)你可以将脚本的某些区域标记为从源代码中的覆盖率报告中排除:

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

稀疏地使用它可能会在将来删除它。

答案 1 :(得分:-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;
    }
}