Я немного спотыкаюсь, пытаясь найти способ проверить, что мой обработчик исключений вызывается при вызове исключения.
Это идея, с которой я изначально работал для тестирования:
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
Как я могу проверить, что мой обработчик исключений называется?
Боюсь, вы не можете протестировать обработчик исключений, используя phpspec
, PHPUnit
или другой подобный инструмент тестирования, потому что они оборачивают тест, который вы пишете в try-catch
заблокировать, чтобы поймать любое необнаруженное исключение и сообщить о нем.
С другой стороны, документация set_expection_handler()
говорит:
Устанавливает обработчик исключений по умолчанию, если исключение не перехвачено в блоке try / catch.
поскольку phpspec
ловит все исключения, которые выдает ваш тестовый код, у установленного вами обработчика исключений нет шансов на запуск 🙁
Я думаю, что все неисследованные исключения заканчивают свое приключение в ExampleRunner.php
в строке 96
Других решений пока нет …