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