php - Laravel 5.2 Codeception 功能测试问题与 PUT/PATCH 请求

标签 php laravel-5 request put codeception

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

对于所有其他模拟 http 请求,一切都很顺利,但是当 codeception 尝试在 put HTTP 请求上执行更新方法时(带有值为“PUT”的“_method”参数的 POST 请求),我的 Controller 永远不会执行,这会导致更新 url 上的代码接收,而不会在此更新方法中处理后发生重定向。我尝试在更新方法之上重定向到我的主页来测试这一事实,但重定向从未发生。

作为信息,我使用 Laravel5 模块。这是我的功能性.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'

我尝试将“_method”参数的“PUT”值替换为“PATCH”,以查看是否可以看到任何更改,但问题仍然存在并且行为仍然相同。

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:2015 年 1 月 26 日
正如我所要求的,这是我的路线文件。
正如你所看到的,我使用 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\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:2015 年 1 月 29 日
按照 Lerzenit 解决方案的解释 here ,我尝试将以下代码放入文件tests/_bootstrap.php:

Request::enableHttpMethodParameterOverride();

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

 
编辑 3:2015 年 5 月 2 日
我有一个关于调查方式的线索:我成功地对一个名为“District”的实体执行了更新,这是我的项目中唯一一个在英语和法语中具有相同路线的实体。正如我之前指出的,我使用 LaravelLocalization 插件,并且路由翻译可能是使用 PUT_method 参数进行错误解释的原因应重定向到我的 Controller 的更新方法的值。

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

最佳答案

终于找到解决办法了!

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

Laravel 期望在斜线之后的更新或删除请求中给出一个 id,这就是为什么从未到达更新/删除方法的原因。事实上,在 PUT/PATCH/DELETE 请求中传递参数是一种不好的做法,因为目标资源必须在 url 中显式显示。

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

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

关于php - Laravel 5.2 Codeception 功能测试问题与 PUT/PATCH 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34990335/

相关文章:

rest - 无法通过 web.config 设置 maxReceivedMessageSize

php - Laravel 路由返回 500 错误

php - Symfony - 为命名路由生成 URL 但不存在

javascript - 使用 laravel、vue.js 和 axios 删除 owl 幻灯片

php - Laravel 5 从另一种方法重定向

python - 什么是全局默认超时

javascript - 如何从 GET 请求收集 Google Analytics 的客户端 ID 服务器端?

php - MySQL:对于表上的每一行,然后从其他表中获取数据

php - 将函数中的 session 变量传递给 codeigniter 中的助手

php - 将成员添加到 MailChimp 列表时出现 400 错误请求