【问题标题】:PHPUnit: How do I obtain the ORIGINAL exception that causes a PHPUnit_Framework_Error_WarningPHPUnit:如何获得导致 PHPUnit_Framework_Error_Warning 的 ORIGINAL 异常
【发布时间】:2015-06-01 14:16:28
【问题描述】:

我正在为一个处理 XML 的新 PHP 类 (v5.3.3) 编写 PHPUnit 测试 (v4.6.7)。测试的目的是确认类在处理错误的 XML 时抛出 DOMException。

我想收集异常并对其执行assertInstanceOf,将其与DOMException 进行比较。

无论我做什么,当我看到异常时,phpunit 已经将原始异常转换为PHPUnit_Framework_Error_Warning 的实例。

例如,下面是测试代码中的一项工作:

//...
try {
    $this->code_that_causes_exception();
} catch (\Exception $exception) {
    $className = get_class($exception);
    throw $exception;
}
//...

在 phpunit 中运行时,存储在 $className 中的字符串是 PHPUnit_Framework_Error_Warning,而不是 code_that_causes_exception 实际引发的任何异常。

开始更新

只是为了澄清我的问题,没有尝试/捕获被测代码,phpunit 报告的消息是DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1。我做出了一个可能轻率的假设,即 DOMDocument 会抛出某种异常来生成此消息。 DOMDocument 表示 DOMException 是 DOMDocument 对象抛出的异常的父级。

结束更新

我想要原始异常,以便我可以使用适当的 try/catch 包装被测代码,以优雅地处理这种失败情况。 如何获取实例化 PHPUnit_Framework_Error_Warning原始异常?

【问题讨论】:

    标签: php exception exception-handling phpunit


    【解决方案1】:

    为什么会这样

    您的异常未转换PHPUnit_Framework_Error_Warning,它永远不会抛出。 PHPUnit 自动将PHP 警告转换为异常。这是通过 XML 配置文件中的convertWarningsToExceptions 属性启用的(也分别有convertNoticesToExceptionsconvertErrorsToExceptions)。所有这些设置默认为true

    这意味着您的原始异常可能永远不会抛出,因为之前触发了 PHP 警告,然后由 PHPUnit 的错误处理程序转换为(立即抛出的)异常。

    仔细查看您捕获的异常,看看您的代码中的哪个语句触发了 PHP 警告(只需删除 try/catch 语句,让 PHPUnit 显示错误)。

    您可以在 phpunit.xml 文件中禁用此行为:

    <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.6/phpunit.xsd"
         ...
         convertErrorsToExceptions="false"
         convertNoticesToExceptions="false"
         convertWarningsToExceptions="false"
         ...
    

    您应该如何测试异常

    断言抛出特定异常的最简单的方法可能是使用@expectedException 注释。这是讨论in-depth in the manual。使用这个注解可以节省大量的样板代码:

    /**
     * @expectedException DOMException
     * @test
     */
    public function myTestCase() {
        $this->code_that_causes_exception();
    }
    

    此测试将在抛出 DOMException 时通过,在完全没有抛出异常(或抛出任何其他异常)时失败。

    【讨论】:

    • 这很有帮助。我运行此测试的目的是发现实际代码中实际发生的异常、警告或通知。 phpunit 在 PHPUnit_Framework_Error_Warning 中报告的“消息”是DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity, line: 1。我的编码任务是扩展被测代码以识别并正确处理这种情况。因此,我想要一种简单的方法来查看引发它的任何 php 行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多