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 относительно того, что происходит.
Ответы
Ответ 1
Я думаю, что нашел ответ после многого отладки командной строки (используя phpstorm):
Функция обработки маршрута регистра POST в контроллере была объявлена следующим образом:
public function postRegister(RegistrationRequest $request)
{
... требует, чтобы экземпляр запроса был передан через инъекцию зависимостей. Этот запрос содержал некоторый код проверки и если по какой-либо причине код проверки не смог выполнить (например, выбрасывает исключение), то функция контроллера никогда не будет вызвана - поскольку создание запроса не выполняется.
Это, в браузере, выбрасывает 500 ошибок, но на земле с кодом, исключение поймано иначе и возвращает перенаправление на/без данных. Все это происходит вне функции контроллера, а не внутри него, так что оператор Log в функции контроллера никогда не запускается, потому что функция никогда не вызывается. Обработчик исключений в генерации кода является общей ловушкой.
Неявное предположение заключается в том, что, возможно, инъекции зависимостей в контроллерах - плохая идея. Или, может быть, эти общие обработчики исключений - плохая идея.