如何使用phpspec测试异常处理程序

时间:2015-03-05 11:11:37

标签: php phpspec

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

这是我最初合作进行测试的想法:

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

Client有一个方法catchException,它将通过set_exception_handler设置为异常处理程序:http://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

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

1 个答案:

答案 0 :(得分:1)

我担心您无法使用phpspecPHPUnit或其他类似的测试工具测试异常处理程序,因为它们将您编写的测试包装到try-catch块中以便捕获任何异常处理程序没有被捕的例外并报告它。

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

  

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

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

我认为所有未被捕获的例外都会在ExampleRunner.php at line 96

中结束他们的冒险