Laravel 5 / Codeception неправильно маршрутизируется

Я пытаюсь написать тестовый пример API для функции контроллера с использованием кодагенера, и я сталкиваюсь с проблемой, когда маршрут к функции контроллера не представляется корректным, и оценка, похоже, отличается в зависимости от того, что я есть в моем случае.

Вот пример кода из моего тестового примера:

use \ApiTester; class CustomerRegisterCest { // tests public function testGetRegister(ApiTester $I) { $I->sendGET('register'); $I->seeResponseCodeIs(200); } public function testPostRegister(ApiTester $I) { $I->sendPOST('register', [ // set the data in here ]); $I->seeResponseCodeIs(200); } 

У меня есть файл route.php, содержащий эти маршруты:

 Route::get('/', ['as' => 'home', 'uses' => 'HomeController@getIndex']); Route::get('register', ['as' => 'getRegister', 'uses' =>'RegistrationController@getRegister']); Route::post('register', ['as' => 'postRegister', 'uses' => 'RegistrationController@postRegister']); 

Я вставил некоторые инструкции debug в мои классы контроллеров, чтобы я мог видеть, какие маршруты запускаются, например:

  Log::debug('GET register'); // or GET index or POST register, etc 

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

Когда я запускаю тестовый пример, как указано выше, я получаю следующий вывод отладки:

 GET register GET index 

… поэтому кажется, что sendPOST ('register', …) фактически направляет маршрут GET для «/» вместо маршрута POST для «/ register». За пределами тестового сценария все работает нормально – я могу ПОСТЫВАТЬ на пути регистрации отлично, маршрутизация работает нормально, проблема возникает только в случае проверки кода.

Если я изменю тестовый пример, так что я делаю sendGET и sendPOST внутри одного вызова функции, например:

  // tests public function testPostRegister(ApiTester $I) { $I->sendGET('register'); $I->seeResponseCodeIs(200); $I->sendPOST('register', [ // set the data in here ]); $I->seeResponseCodeIs(200); } 

то я вижу этот отладочный вывод:

 GET register GET register 

… так что, вставив sendGET в ту же функцию, что и sendPOST, он изменил поведение sendPOST, так что теперь он маршрутизирует маршрут GET для регистрации вместо маршрута GET для индекса (но все равно не будет маршрутизировать правильный маршрут POST).

Я попытался включить xdebug и не имею никаких подсказок из вывода xdebug относительно того, что происходит.

Я думаю, что нашел ответ после многого отладки командной строки (используя phpstorm):

Функция обработки маршрута регистра POST в контроллере была объявлена ​​следующим образом:

 public function postRegister(RegistrationRequest $request) { 

… требует, чтобы экземпляр запроса был передан через инъекцию зависимостей. Этот запрос содержал некоторый код проверки, и если по какой-либо причине код проверки не мог завершить (например, выбрасывает исключение), то функция контроллера никогда не будет вызвана – потому что создание запроса завершается с ошибкой.

Это, в браузере, выбрасывает ошибку 500, но на земле с кодировкой исключение попадает в ловушку по-разному и возвращает перенаправление на / без данных. Все это происходит вне функции контроллера, а не внутри него, так что оператор Log в функции контроллера никогда не запускается, потому что функция никогда не вызывается. Обработчик исключений в кодексе является общей ловушкой.

Неявное предположение заключается в том, что, возможно, инъекции зависимостей в контроллерах – плохая идея. Или, может быть, эти общие обработчики исключений – плохая идея.