Невозможно протестировать код, используя определения App :: error в Laravel

У меня есть проблемы с тестированием приложений 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

Версии:

  • Ларавелла (каркас): 4.2.9
  • PHPUnit: 4.2.6
  • PHP: 5.5.15 ОС:
  • OSX 10.9.3

Кто-нибудь знает, как решить эту проблему, так что приложение: ошибки на самом деле возникают при тестировании? Или я что-то не так делаю с тем, как выбрасывать и ловить исключения?

0

Решение

Прошло много времени с тех пор, как вы задали этот вопрос, но, надеюсь, это поможет кому-то найти ответ на этот вопрос:

Увидеть Тейлора Отвелла прокомментировать это. Воспроизведено ниже:

«Посмотрев на источник PHPUnit, они ловят исключения и проглатывают их, чтобы ваши обработчики не были пойманы.

Но я думаю, что это можно решить, отключив тест. Вы действительно хотите протестировать обработчик, и в любом случае исключение выдается совершенно отдельно для изоляции ваших тестов. Например:

App::error(function(ErrorType $e)
{
App::make('ErrorTypeHandler')->handle($e);
});

Теперь вы можете написать контрольные примеры для класса ErrorTypeHandler отдельно от остальной части вашего приложения. Затем убедитесь, что ваше приложение генерирует правильные исключения с @expectedException. «

Проще говоря, реализуйте ваши обработчики исключений отдельно, если вы хотите их протестировать.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]