4

我在寻找一种方法来测试我的异常处理程序是否在抛出异常时被调用时有点磕磕绊绊。

这是我最初用于测试的想法:

class ClientSpec extends ObjectBehavior
{
    function it_should_catch_exceptions(Config $config)
    {
        $e = new Exception('test exception');
        $this->catchException($e)->shouldBeCalled();
        throw $e;
    }
}

Client有一个方法catchException将通过以下方式设置为异常处理程序: http set_exception_handler: //php.net/set_exception_handler

运行这个测试给了我这个反馈:no beCalled([array:0]) matcher found for null,所以我也尝试创建一个规范Exception并执行以下操作:

class ExceptionSpec extends ObjectBehavior
{
    function it_should_trigger_opbeat_client_when_thrown(Client $client)
    {
        $client->catchException($this)->shouldBeCalled();
        throw $this->getWrappedObject();
    }
}

但是运行这个测试会返回另一个错误:exception [exc:Exception("")] has been thrown

如何测试我的异常处理程序是否被调用?

4

1 回答 1

1

恐怕您无法使用或其他类似的测试工具来测试异常处理程序phpspec,因为它们会将您编写的测试包装到一个块中,以便捕获任何未捕获的异常并报告它。PHPUnittry-catch

另一方面,文档set_expection_handler()说:

如果在 try/catch 块中未捕获到异常,则设置默认异常处理程序。

由于phpspec捕获了您的测试代码抛出的所有异常,因此您安装的异常处理程序没有机会运行:-(

我认为所有未捕获的异常都会ExampleRunner.php在第 96 行结束他们的冒险

于 2015-03-05T11:42:45.260 回答