Почему codeception запускает промежуточное ПО на маршрутах в Laravel, которые не следует запускать?

Итак, я новичок в коде и пытаюсь понять, как протестировать свой веб-сервис, используя то же самое. Я написал свой первый простой тест для маршрута authenticate, чтобы убедиться, что приложение выдает токен JWT, как и должно. Тест выглядит так:

<?php 
$I = new ApiTester($scenario);
$I->wantTo('authenticate a user');
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
$I->sendPOST('/api/authenticate', [
    'username' => 'archive',
    'email' => '[email protected]',
    'password' => 'password'
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();

В свою защиту я попробовал тот же POST от Postman, и он отлично работает.

api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5
    config: 
        Laravel5:
            environment_file: .env.testing

Проблема, с которой я столкнулся в этом тесте, заключается в том, что он не видит 200 OK в качестве кода ответа, а вместо этого видит 500. Позже я понял, что могу просмотреть то же самое в каталоге _output, и увидел эту ошибку:

Токен не может быть проанализирован из запроса

Теперь, к моему удивлению, для маршрута authenticate даже не требуется токен, поэтому я продолжил поиск, где в моем приложении анализируется токен. Наконец я понял, что есть промежуточное ПО под названием ChangeDb, которое находится в Kernal, и оно проверяет токен из каждого запроса, кроме маршрута authenticate. Это выглядит так:

public function handle($request, Closure $next)
{
    if($request->path() != 'api/authenticate'){
        $username = \JWTAuth::parseToken()->getPayload()->get('username');

        if(! $username){
            \Config::set('database.connections.tenant.database', 'archive');
            \DB::reconnect();
            \DB::setDatabaseName('archive');
        }else{
            \Config::set('database.connections.tenant.database', $username); 
        }
    }

    return $next($request);
}

Но когда я попытался прокомментировать это из ядра, тест проходит нормально и дает мне зеленый цвет. Каким-то образом это промежуточное ПО работает нормально, когда я пробую его из Postman и другого ajax-запроса, но когда Codeception пытается выполнить запрос, if statement возвращает true, по-видимому, потому, что он просматривает токен, и именно здесь мой тест терпит неудачу.

Так почему это происходит? Отличается ли запрос, сгенерированный Codeception, от запроса, сгенерированного Postman или моим приложением ajax на внешнем интерфейсе? Как обойти это?


person Rohan    schedule 04.11.2015    source источник
comment
добавьте var_dump($request->path()); die; в начало метода дескриптора и перезапустите этот тест. Какой результат вы получаете?   -  person Naktibalda    schedule 04.11.2015


Ответы (1)


Итак, как я предположил, Laravel5 проблема была в зависимости в разделе REST. Он не имитировал реальные HTTP запросы, поэтому middleware не мог сказать, откуда пришел запрос. Я изменил его на PhpBrowser, и теперь он работает. PhpBrowser видимо имитирует настоящие HTTP запросы.

person Rohan    schedule 09.11.2015