如何在 PHPUnit 中覆盖异常类

Mik*_*raf 5 php phpunit code-coverage

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

示例代码

class My_DataException extends Exception
{}

class Foo
{
   function __construct() { throw new My_DataException('see?'); }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得 My_DataException 的代码覆盖率(在 library/My/DataException.php 中)或从代码覆盖率报告中排除该文件?我不想使用注释方法(@codeCoverageIgnore 或类似的方法)。

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

<filter>
    <blacklist>
        <directory suffix="Exception.php">../library/</directory>
    </blacklist>
</filter>
Run Code Online (Sandbox Code Playgroud)

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

额外细节:

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

hak*_*kre 3

对于以下代码:

class Foo
{
    function __construct() {
        throw new My_DataException('see?');
    }
}s
Run Code Online (Sandbox Code Playgroud)

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

new Foo;
Run Code Online (Sandbox Code Playgroud)

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

/**
 * @expectedException My_DataException
 */
Run Code Online (Sandbox Code Playgroud)

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

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

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

// @codeCoverageIgnoreStart
throw new My_DataException('see?');
// @codeCoverageIgnoreEnd
Run Code Online (Sandbox Code Playgroud)

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