Итак, я новичок в коде и пытаюсь понять, как протестировать свой веб-сервис, используя то же самое. Я написал свой первый простой тест для маршрута 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 на внешнем интерфейсе? Как обойти это?
var_dump($request->path()); die;
в начало метода дескриптора и перезапустите этот тест. Какой результат вы получаете? - person Naktibalda   schedule 04.11.2015