Подтвердить что ты не робот

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' => '[email protected]']);
Route::get('register', ['as' => 'getRegister', 'uses' =>'[email protected]']);
Route::post('register', ['as' => 'postRegister', 'uses' => '[email protected]']);

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

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

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

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

GET register
GET index

... поэтому кажется, что sendPOST ('register',...) фактически направляет маршрут GET для "/" вместо маршрута POST для "/register". За пределами тестового сценария все работает нормально - я могу нормально настроить POST на пути регистрации, маршрутизация работает нормально, проблема возникает только в тестовом случае с кодом.

Если я изменю тестовый пример, так что я делаю 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 относительно того, что происходит.

4b9b3361

Ответ 1

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

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

public function postRegister(RegistrationRequest $request)
{

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

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

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