2015-11-04 5 views
0

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

<?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].com', 
    'password' => 'password' 
]); 
$I->seeResponseCodeIs(200); 
$I->seeResponseIsJson(); 

В свою защиту я попытался тот же пост от Почтальон и она прекрасно работает.

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, и я увидел эту ошибку:

The token could not be parsed from the request

Теперь к моему удивлению, 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); 
} 

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

Итак, почему это происходит? Получается ли запрос, генерируемый в Codeception, каким-то образом из запроса, созданного из Postman или моего приложения ajax на лицевой стороне? Как обойти это?

+0

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

ответ

0

Так, как я предполагал, Laravel5, поскольку проблема в разделе REST была проблемой. Это не было симулирование реальных запросов HTTP, и поэтому middleware не мог определить, откуда пришел запрос. Я изменил его на PhpBrowser, и теперь он работает. PhpBrowser, по-видимому, имитирует реальные запросы HTTP.