В тестах контроллера (интеграции) исключения по умолчанию не попадают в обработчик исключений PHPUnits.
Это вызвано тем, что ваше приложение использует промежуточное ПО обработчика ошибок (см. src/Application.php
), которое будетпоймать исключение, выброшенное в коде, который он переносит, и соответствующим образом отображает страницу / ответ об ошибке или из-за того, что тестовый пример интеграции делает нечто подобное, то есть он будет перехватывать возможные исключения (за исключением \PHPUnit\Exception
, \Cake\Database\Exception\DatabaseException
иLogicException
) и отображает страницу с ошибкой / ответ, чтобы исключения не всплывали в обработчике исключений PHPUnits, это предотвращает остановку выполнения теста и позволяет протестировать как объект исключения, так и вывод(например, страница ошибки), сгенерированная вашим приложением.
Короче говоря, в тестах контроллера вы должны вручную проверять наличие исключений в случае, если ваше приложение не используетпромежуточное программное обеспечение обработчика ошибок , которое можно сделать, протестировав \Cake\TestSuite\IntegrationTestCase::$_exception
propвот так:
$this->assertEquals(\Cake\Network\Exception\InternalErrorException::class, $this->_exception);
(кроме того, вы можете затем протестировать ответ как обычно с помощью, например, методов \Cake\TestSuite\IntegrationTestCase::assertResponse*()
или свойства \Cake\TestSuite\IntegrationTestCase::$_response
)
или, если ваше приложение использует использование промежуточного программного обеспечения для обработчика ошибок , и вы хотите протестировать объект исключения вместо сгенерированного ответа / страницы с ошибкой, убедитесь, что промежуточное программное обеспечение для обработчика ошибок "исключено",соответственно, исключения перебрасываются, что, например, может быть достигнуто с помощью метода \Cake\TestSuite\IntegrationTestCase::disableErrorHandlerMiddleware()
, который доступен с CakePHP 3.5.0, например:
$this->disableErrorHandlerMiddleware();
// ...
$this->post(/* ... */); // < exception will be triggered there and halt the test
При этом вы можете / имеетеиспользовать функциональность подтверждения исключений PHPUnits, то есть аннотации или методы expectException*()
.