Testing 测试更新用户配置文件数据

Testing 测试更新用户配置文件数据,testing,laravel-5,Testing,Laravel 5,我在我的Laravel 5.7应用程序中使用配置文件页面(具有“配置文件视图”页面和“配置文件详细信息”编辑器)进行http测试,如: 添加新用户并打开“纵断面图”页面正常,但在步骤//7中存在问题。修改配置文件详细信息页面块开始 正如我在sql跟踪中看到的,新用户被插入,但没有更新 在my control app/Http/Controllers/ProfileController.php中,使用验证请求定义更新方法: public function update_details(Profil

我在我的Laravel 5.7应用程序中使用配置文件页面(具有“配置文件视图”页面和“配置文件详细信息”编辑器)进行http测试,如:

添加新用户并打开“纵断面图”页面正常,但在步骤//7中存在问题。修改配置文件详细信息页面块开始 正如我在sql跟踪中看到的,新用户被插入,但没有更新

在my control app/Http/Controllers/ProfileController.php中,使用验证请求定义更新方法:

public function update_details(ProfileUserDetailsRequest $request)
{
    $userProfile = Auth::user();
    $requestData = $request->all();
    $userProfile->first_name = $requestData['first_name'];
    $userProfile->last_name  = $requestData['last_name'];
    $userProfile->phone      = $requestData['phone'];
    $userProfile->website    = $requestData['website'];
    $userProfile->updated_at = now();
    $userProfile->save();
    $this->setFlashMessage('Profile updated successfully !', 'success', 'Profile');
    return Redirect::route('profile-view');
} // public function update_details(ProfileUserDetailsRequest $request)
1) 原因是否可能在ProfileUserDetailsRequest中,以及如何处理? 我的个人资料详细信息编辑器工作正常

我的路线定义为:

Route::group(array('prefix' => 'profile', 'middleware' => ['auth', 'isVerified']), function(){
    Route::post('edit-details-post', array(
        'as'      => 'profile-edit-details-post',
        'uses'    => 'ProfileController@update_details'
    ));
起初我试着用PUT,但之后我试着用POST——同样没有结果

2) 你能建议一些正确的方法来检查//7上的用户配置文件详细信息吗。修改配置文件详细信息页面阻止开始步骤

修改块#2:

我尝试了补丁方法,但无论如何都不起作用。 我的app/Http/Controllers/ProfileController.php中有调试方法

public function update_details(ProfileUserDetailsRequest $request)
{
方法,当测试运行时,我看到它并没有被触发。 我使用相同的update_details方法在brauser中更新我的表单,它工作正常(我也看到了调试信息)

我想这可能是csrf问题,我在测试文件的头中写道:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use DB;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\WithoutMiddleware; // Prevent all middleware from being executed for this test class.


    public function testProfilePage()
    {
        $csrf_token = csrf_token();
        ...

        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->patch('profile/edit-details-post', [
                             'first_name' => 'Modified : ' . $newUser->first_name,
                             'last_name'  => 'Modified : ' . $newUser->last_name,
                             'phone'      => 'Modified : ' . $newUser->phone,
                             'website'    => 'Modified : ' . $newUser->website,
//                             '_token'     => $csrf_token  / I TRIED TO UNCOMMENT THIS LINE TOO
                         ]);
        $response->assertStatus(205);   // making this check I see that code 419 was returned
如果在命令行中,我运行测试作为

  vendor/bin/phpunit   tests/Feature/ProfilepageTest.php
除此之外,我还有什么要补充的


谢谢

如果您使用类似于Visual Studio的IDE代码来运行代码,请尝试使用类似于xdebug的调试器。在update_details方法中放置一个断点,查看它是否正在保存,保存是否正在执行。如果是,则我们知道save没有正确更新

根据更新文档,您所做的似乎是正确的: 以下文档中的示例:

$flight = App\Flight::find(1);

$flight->name = 'New Flight Name';

$flight->save();

在我脑海中,我唯一的猜测是为什么它会失败,可能是让用户离开auth对象会导致问题。在auth对象中获取用户的id,并使用find()获取用户,然后更新其值并保存,然后查看是否有效。

除了补丁而不是POST之外,以下是我对测试代码的建议

尝试使用简单请求而不是ProfileUserDetailsRequest

尝试在更新函数中记录$request变量,并检查_标记和_方法是否可用,方法是否应为PATCH,请求变量是否正确发布

创建用户表的模型,并尝试使用该模型更新用户

$user = User::find(Auth::user()->id);
…
$user->save();

会话是使用中间件启动的,我认为如果禁用中间件,会话将无法工作。

对不起,我仍在搜索我的配置文件测试的决策。有什么想法吗?你为个人资料页做过tesr吗?可能是指向此类文章/常见问题解答的链接?您尝试过PUT,但尝试过修补程序吗?我在更新调用中使用了修补程序。请查看修改过的块#2。我尝试过跟踪它,并对ProfileUserDetailsRequest(尽管我需要它)进行了注释,它工作正常(需要记录调试信息)当我从浏览器AMD419更新配置文件页面时,运行测试时出错,并且没有从此控件的操作内部进行调试。也许这是middlewaere/csrf的问题……根据您的评论,我了解到您通过浏览器收到了错误419,因此问题可能出在视图或控制器代码以及您检查过的ProfileUserDetails请求代码中的某个地方。但我再次强调,试着分离代码的不同部分并逐个测试它们,针对一个问题提问;你的提问方式对任何人来说都很难回答。隔离的一种方法是制作一个新的Laravel应用程序,并尝试在该应用程序上测试一个模块,例如,在该应用程序中只制作ProfileUserDetails请求,并使用最少的相关表和函数。然后在那里进行测试。即使在现有的应用程序中,你也可以这样做,但请尝试分离错误并逐一修复。亲爱的@mstdmstd,让我告诉你构建应用程序时遵循的步骤。我将我的应用程序划分为几个小模块,然后将每个模块划分为更多的小部分,我从构建一个小的初始模块开始,在添加下一个模块之前,我分别构建和测试它,在它开始正常工作后,我将其添加到我的原始应用程序中。这可能不是最好的策略,但它对我来说很有效,并且使我避免了很多潜在的问题。
$flight = App\Flight::find(1);

$flight->name = 'New Flight Name';

$flight->save();
$user = User::find(Auth::user()->id);
…
$user->save();