我找到了一种方法来测试我的异常处理程序在抛出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
如何测试我的异常处理程序是否被调用?
答案 0 :(得分:1)
我担心您无法使用phpspec
,PHPUnit
或其他类似的测试工具测试异常处理程序,因为它们将您编写的测试包装到try-catch
块中以便捕获任何异常处理程序没有被捕的例外并报告它。
另一方面,set_expection_handler()
的文档说:
如果未在try / catch块中捕获异常,则设置默认异常处理程序。
由于phpspec
捕获了测试代码抛出的所有异常,因此您安装的异常处理程序无法运行: - (
我认为所有未被捕获的例外都会在ExampleRunner.php
at line 96