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

时间:2016-01-25 10:30:06

标签: php laravel-5 request put codeception

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

对于其他所有模拟的http请求,一切都很顺利但是当codeception尝试在put HTTP请求上执行update方法时(具有值为“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
正如我所问,这是我的路线文件 如您所见,我使用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:29/01/2015
在Lerzenit解决方案解释here之后,我尝试将以下代码放入文件tests / _bootstrap.php中:

Request::enableHttpMethodParameterOverride();

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


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

如果有人能帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我提出了类似的问题here,我设法得到了解决方案。我的解决方案可能对您有所帮助。

答案 1 :(得分:1)

我终于找到了解决方案!

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

Laravel期望在斜杠之后在帖子UPDATEDELETE请求上给出id,这就是为什么永远不会达到UPDATE / DELETE方法的原因。实际上,在PUT / PATCH / DELETE请求中传递请求中的params是一种不好的做法,因为必须在URL中明确显示目标资源。

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

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