2016-01-25 2 views
2

У меня возникла проблема с обработкой обновлений, обработанной в мои функциональные тесты по Codeception: у меня систематическая ошибка 404. Вот подробности.Laravel 5.2 Проблема функционального теста с коллаксией с запросами PUT/PATCH

Все идет хорошо для всех других имитируемых HTTP-запросов, но когда кодгенерация пытается выполнить метод обновления по HTTP-запросу put (запрос POST с параметром «_method», имеющим значение «PUT»), никогда не выполняется моим контроллером , которые приводят к созданию кода на URL-адресе обновления без перенаправления, который должен произойти после обработки в этом методе обновления. Я попытался перенаправить на свою домашнюю страницу поверх моего метода обновления, чтобы проверить этот факт, и перенаправление никогда не произойдет.

Для информации, я использую модуль Laravel5. Вот мое содержание functional.suite.yml файла:

class_name: FunctionalTester 
modules: 
    enabled: 
     - Asserts 
     - \Helper\Functional 
     - MailCatcher 
     - Laravel5: 
      environment_file: .env.testing 
    config: 
     MailCatcher: 
      url: 'http://192.168.10.10' 
      port: '1080' 

Я попытался заменить «PUT» значение «_method» парам по «заплатки», чтобы увидеть, если какие-либо изменения можно увидеть, но проблема сохраняется и поведение по-прежнему остается прежним.

Codeception включает приложение Laravel5 для его проверки. Единственный ключ, который у меня есть, заключается в том, что тестовая среда имеет проблему для интерпретации запроса PUT или PATCH. Для простого запроса POST нет проблем (создание не вызывает никаких проблем).

Я точно знаю, что форма HTML правильная, обновление происходит правильно в моей локальной среде, а http-запрос содержит правильные параметры. Вот что у меня есть, когда я исполню ее в с --debug вариант:

[Uri] http://project/en/permissions/update 
[Method] POST 
[Parameters] {"_token":"RUx7DjU3b6GEjodnpwXvJJYJIcmQJGbabj23q0yK","_method":"PATCH","_id":"1","name_en":"Administrator","name_fr":"Administrateur","slug":"admin"} 
[Page] http://project/en/permissions/update 
[Response] 200 
[Request Cookies] {"XSRF-TOKEN":"eyJpdiI6InZQV2NVcTRoZHVONXYzZzNLTnBWU1E9PSIsInZhbHVlIjoiWWhWa0kyUGxJNkJRTXIyaEhVcDdHR0tRcklHZStpVWdlTjlDdmRKVmEyVDFPWkxBVmhLc1lra05zeWh1ZWtKMENCc29lWFZTN2lSd3dIbjZyNEo5eWc9PSIsIm1hYyI6ImEzMDNmOWM5OGQzNzE4ZWI5MDg0MTI0ZmQwMTI1ZTk0OTM1OTY4NjA5ZTZjMGFhYTI0MTdlMzMzM2QyMWQ4MzUifQ==","laravel_session":"eyJpdiI6ImF4cVFYYVNUU3J0WUd2VzNRZlhSc3c9PSIsInZhbHVlIjoibDdPd3ZEZVZOdDJwRlBjMVZtc2dNM0I3WUw0REEzK25NVFVWT1FIRjEzR05tRGZLXC9SYUZkRmhEdXlyQVdybURHTWVQVUtucnBkZEwwaTN4NWF6XC9YQT09IiwibWFjIjoiMzliODY4ZWUwYmZjODI1OTVkMTBiYjA4ODY2OWNiODc3ZTI1NzAzZmJhMjg4OTY4Y2MzM2VkMjYyYTkwOTQ2MyJ9"} 
[Response Headers] {"cache-control":["no-cache"],"Set-Cookie":[{},{}]} 

Как вы можете видеть, в конце процесса на 200 ответ, и это все .. Я проверил это с несколькими страницами и проблема везде одинакова.

Я заблокирован этой проблемой уже несколько недель, не найдя решения. Если у кого-то есть ключ, я слушаю!.

 
EDIT 1: 26/01/2015
Как уже было предложено мне, вот мой файл маршрутов.
Как вы можете видеть, я использую LaravelLocalization, это многоязычное приложение.
Я только показываю вам маршруты разрешений, но все они управляются таким образом.

Route::group([ 
'prefix'  => LaravelLocalization::setLocale(), 
'middleware' => [ 
    'auth', 
    'localize', 
    'localeSessionRedirect', 
    'localizationRedirect', 
]], function() { 

// permissions 
Route::get(LaravelLocalization::transRoute('routes.permissions.index'), ['as' => 'permissions.index', 'uses' => 'User\[email protected]']); 
Route::get(LaravelLocalization::transRoute('routes.permissions.create'), ['as' => 'permissions.create', 'uses' => 'User\[email protected]']); 
Route::post(LaravelLocalization::transRoute('routes.permissions.store'), ['as' => 'permissions.store', 'uses' => 'User\[email protected]']); 
Route::get(LaravelLocalization::transRoute('routes.permissions.edit'), ['as' => 'permissions.edit', 'uses' => 'User\[email protected]']); 
Route::put(LaravelLocalization::transRoute('routes.permissions.update'), ['as' => 'permissions.update', 'uses' => 'User\[email protected]']); 
Route::delete(LaravelLocalization::transRoute('routes.permissions.destroy'), ['as' => 'permissions.destroy', 'uses' => 'User\[email protected]']); 

}); 

 
EDIT 2: 29/01/2015
После решения Lerzenit объяснил here, я попытался поместить следующий код в файл тестов/_bootstrap.php:

Request::enableHttpMethodParameterOverride(); 

Это не имело никакого эффекта, у меня все еще есть ответ 200, и метод обновления моего контроллера никогда не достигается.
Я проверил, был ли параметр $httpMethodParameterOverride отправлен в true сразу после выполнения метода и может проверить, что успешно установлено значение true.
Я все еще ищу решение.

 
EDIT 3: 05/02/2015
У меня есть ключ на пути к расследованию: мне удалось выполнить обновление на лицо под названием «Район», и это только один в моем проекте иметь один и тот же маршрут на английском и французском языках. Как я указывал ранее, я использую плагин LaravelLocalization, и перевод маршрутов может быть причиной плохой интерпретации параметра _method с значением PUT, который должен перенаправляться к методу обновления моего контроллера.

Я был бы признателен, если бы кто-нибудь мог мне помочь в этом.

+0

Показать файл маршрутов – mcklayin

+0

Здравствуйте, @mcklayin, я отредактировал мое сообщение выше, чтобы показать файл маршрутов. – Okipa

ответ

1

Я наконец нашел решение!

Метод обновления никогда не был достигнут, потому что в моих POST-запросах я иногда передавал идентификатор ресурса в запрос, используя скрытые переменные, например, как _id.

Laravel ожидает, что идентификатор будет отправлен на сообщение UPDATE или DELETE запросов после косой черты, поэтому методы UPDATE/DELETE не были достигнуты. На самом деле, это плохая практика, чтобы передать параметры в запросе на запросы PUT/PATCH/DELETE, потому что целевой URL-адрес должен быть явно указан в URL-адресе.

Итак, если вы столкнулись с той же проблемой, убедитесь, что вы точно указали правильный маршрут POST в своей форме, например, route('users.update', ['id' => $user->id]).

Pfiuuu, теперь я могу написать свои тесты, чтобы иметь 100% протестированное приложение. Это было болезненное расследование;)

2

Я сделал аналогичный вопрос here, и мне удалось найти решение. Мое решение может быть полезно для вас.

+0

Ницца! Я написал ответ на ваш пост несколько дней назад, объяснив, что я столкнулся с одной и той же проблемой, но он был сомнительно удален под предлогом того, что он не был связан с вашим ... Во всяком случае, я попробую это сегодня! Благодаря вам. – Okipa

+0

Плохие новости, это ничего не меняет, метод обновления с моего контроллера никогда не выполняется .. Какую версию Laravel вы используете? – Okipa

+0

Я использую laravel 5.0 – Lerzenit