5

我的目标是非常高的代码覆盖率,并且想要覆盖异常类或将它们从代码覆盖率报告中排除。

示例代码

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.php”结尾,所以我不确定为什么后缀部分不起作用。

额外细节:

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

2 回答 2

3

对于以下代码:

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

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

new Foo;

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

/**
 * @expectedException My_DataException
 */

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

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

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

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

稀疏地使用它,您将来可能希望将其删除。

于 2012-08-10T08:28:17.430 回答
-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;
    }
}   
于 2012-09-21T23:13:08.927 回答