Laravel 5.2 PUT / PATCH请求的Codeception功能测试问题


Laravel 5.2 Codeception functional test issue with PUT / PATCH requests

我在Codeception上处理功能测试的更新处理时遇到问题:我系统地遇到404错误。以下是详细信息。

对于其他每个模拟的 http 请求,一切都进展顺利,但是当 codeception 尝试在 put HTTP 请求上执行更新方法时(带有值为"PUT"的"_method"参数的 POST 请求)永远不会由我的控制器执行,这会导致更新 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'

我试图用"PATCH"替换"_method"参数的"PUT"值,看看是否可以看到任何变化,但问题仍然存在,行为仍然相同。

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 响应结束,仅此而已。我用几页测试了它,问题到处都是一样的。

我在这个问题上被阻止了几个星期,没有找到任何解决方案。如果有人有线索,我在听!

 
编辑 1 : 26/01/2015
正如有人问我的那样,这是我的路由文件。
如您所见,我使用Laravel本地化,这是一个多语言应用程序。
我只向您展示权限路由,但它们都是以这种方式管理的。

Route::group([
'prefix'     => LaravelLocalization::setLocale(),
'middleware' => [
    'auth',
    'localize',
    'localeSessionRedirect',
    'localizationRedirect',
]], function () {
// permissions
Route::get(LaravelLocalization::transRoute('routes.permissions.index'), ['as' => 'permissions.index', 'uses' => 'User'PermissionsController@index']);
Route::get(LaravelLocalization::transRoute('routes.permissions.create'), ['as' => 'permissions.create', 'uses' => 'User'PermissionsController@create']);
Route::post(LaravelLocalization::transRoute('routes.permissions.store'), ['as' => 'permissions.store', 'uses' => 'User'PermissionsController@store']);
Route::get(LaravelLocalization::transRoute('routes.permissions.edit'), ['as' => 'permissions.edit', 'uses' => 'User'PermissionsController@edit']);
Route::put(LaravelLocalization::transRoute('routes.permissions.update'), ['as' => 'permissions.update', 'uses' => 'User'PermissionsController@update']);
Route::delete(LaravelLocalization::transRoute('routes.permissions.destroy'), ['as' => 'permissions.destroy', 'uses' => 'User'PermissionsController@destroy']); 
});

 
编辑 2 : 29/01/2015
按照这里解释的 Lerzenit 解决方案,我尝试将以下代码放入文件测试/_bootstrap.php中:

Request::enableHttpMethodParameterOverride();

它没有效果,我仍然有 200 响应,并且从未达到控制器的更新方法。
我检查了$httpMethodParameterOverride参数是否在方法执行后传递给true,并且可以验证是否已成功设置为 true .
我仍在寻找解决方案。

 
编辑 3 : 05/02/2015
我对调查方式有线索:我成功地对一个名为"区"的实体执行了更新,这是我项目中唯一一个在英语和法语中具有相同路线的实体。如前所述,我使用 LaravelLocalization 插件,路由转换可能是对_method参数解释错误的原因,该参数具有应重定向到控制器的更新方法的PUT值。

如果有人能在这方面帮助我,我将不胜感激。

我终于找到了解决方案!

从未达到更新方法,因为在我的 POST 请求中,我有时会通过使用隐藏变量将资源的 id 传递到请求中_id例如。

Laravel希望在帖子UPDATE或斜杠后DELETE请求中给出id,这就是为什么从未达到UPDATE/DELETE方法的原因。事实上,在 PUT/PATCH/DELETE 请求的请求中传递参数是一种不好的做法,因为目标资源必须显式显示在 URL 中。

因此,如果您遇到同样的问题,请确保在表单中精确地使用正确的 POST 路由,例如route('users.update', ['id' => $user->id])

Pfiuuu,我现在可以编写我的测试,以便拥有一个 100% 测试的应用程序。这是一个痛苦的调查;)