У меня есть проблемы с тестированием приложений Laravel, которые генерируют исключения, которые обрабатываются объявлениями App :: errors в global.php. Когда я выполняю запрос к контроллеру с помощью curl в локальной среде, все работает как положено, но при выполнении того же запроса с клиентом в модульном тесте возвращается исключение, а не перехватывается определением app :: error. Я обнаружил эту проблему в полулегком приложении Laravel, но я могу повторить поведение с помощью недавно созданного проекта Laravel.
В моем единственном контроллере я выбрасываю исключение как это:
throw new Exception("My test exception");
И объявление app :: error выглядит так:
App::error(function(Exception $exception, $code) {
Log::error($exception);
return Response::make("YAY from app:error!", 500);
});
Ошибка, которую я получаю при запуске это:
PHPUnit 4.2.6 от Себастьяна Бергмана. Конфигурация читается из /Users/foo/testapp/testapp/phpunit.xml Е Время: 64 мс, память: 9,75 Мб Была 1 ошибка: 1) ExampleTest :: testBasicExample Исключение: мое тестовое исключение /Users/foo/testapp/testapp/app/controllers/TestController.php:23 /Users/foo/testapp/testapp/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:231 /Users/foo/testapp/testapp/bootstrap/compiled.php:5799 /Users/foo/testapp/testapp/bootstrap/compiled.php:5787 /Users/foo/testapp/testapp/bootstrap/compiled.php:4986 /Users/foo/testapp/testapp/bootstrap/compiled.php:5345 /Users/foo/testapp/testapp/bootstrap/compiled.php:5011 /Users/foo/testapp/testapp/bootstrap/compiled.php:4999 /Users/foo/testapp/testapp/bootstrap/compiled.php:722 /Users/foo/testapp/testapp/bootstrap/compiled.php:703 /Users/foo/testapp/testapp/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81 /Users/foo/testapp/testapp/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:327 /Users/foo/testapp/testapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51 /Users/foo/testapp/testapp/app/tests/ExampleTest.php:12
Единственный фрагмент кода, который я добавил в TestCase.php по умолчанию:
/**
* Default preparation for each test
*/
public function setUp() {
parent::setUp();
Route::enableFilters();
}
Единственный код в единственном тесте:
$this->call('GET', 'test'); // test is the only route existing in this app
Версии:
Кто-нибудь знает, как решить эту проблему, так что приложение: ошибки на самом деле возникают при тестировании? Или я что-то не так делаю с тем, как выбрасывать и ловить исключения?
Прошло много времени с тех пор, как вы задали этот вопрос, но, надеюсь, это поможет кому-то найти ответ на этот вопрос:
Увидеть Тейлора Отвелла прокомментировать это. Воспроизведено ниже:
«Посмотрев на источник PHPUnit, они ловят исключения и проглатывают их, чтобы ваши обработчики не были пойманы.
Но я думаю, что это можно решить, отключив тест. Вы действительно хотите протестировать обработчик, и в любом случае исключение выдается совершенно отдельно для изоляции ваших тестов. Например:
App::error(function(ErrorType $e)
{
App::make('ErrorTypeHandler')->handle($e);
});
Теперь вы можете написать контрольные примеры для класса ErrorTypeHandler отдельно от остальной части вашего приложения. Затем убедитесь, что ваше приложение генерирует правильные исключения с @expectedException. «
Проще говоря, реализуйте ваши обработчики исключений отдельно, если вы хотите их протестировать.
Других решений пока нет …