测试更新的用户个人资料数据

时间:2018-10-18 06:19:02

标签: testing laravel-5

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

        $newUser->save();
        $testing_user_id = $newUser->id;
        $newUserGroup           = new UserGroup();
        $newUserGroup->group_id = USER_ACCESS_USER;
        $newUserGroup->user_id  = $newUser->id;

        $userGroup= Group::find($newUserGroup->group_id);

        $newUserSessionData = [
            [
            'loggedUserAccessGroups' => ['group_id' => $newUserGroup->group_id, 'group_name' => !empty($userGroup) ? $userGroup->name : ''],
            'logged_user_ip'         => '0',
            ]
        ];
        $newUserGroup->save();

        // 3. OPEN PROFILE PAGE BLOCK START
        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->get('/profile/view');
        // 3. OPEN PROFILE PAGE BLOCK END


        // 4. MAKING CHECKING PROFILE FOR USER CREATED AT 2) BLOCK START

        $response->assertStatus(200);    // to use HTTP_RESPONSE_OK
        $response->assertSee(htmlspecialchars("Profile : " . $newUser->username, ENT_QUOTES));

        // 4. MAKING CHECKING PROFILE FOR USER CREATED AT 2) BLOCK END


        // 5. OPEN PROFILE DETAILS VIEW PAGE BLOCK START
        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->get('profile/view');
        $response->assertStatus(200);
        $response->assertSee(htmlspecialchars("Profile : " . $newUser->username, ENT_QUOTES));

        // 5. OPEN PROFILE DETAILS VIEW PAGE BLOCK END


        // 6. OPEN PROFILE DETAILS EDITOR PAGE BLOCK START
        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->get('profile/edit-details');   // http://local-votes.com/profile/edit-details
        $response->assertStatus(HTTP_RESPONSE_OK);
        $response->assertSee(htmlspecialchars("Profile : Details"));

        // 6. OPEN PROFILE DETAILS EDITOR PAGE BLOCK END


        // 7. MODIFY PROFILE DETAILS PAGE BLOCK START
        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->post('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
                         ]);
//        $response->assertStatus(205);   // ???

        // 7. MODIFY PROFILE DETAILS PAGE BLOCK END


        ////////////////////////
        // 8. OPEN PROFILE DETAILS VIEW PAGE AFTER MODIFICATIONS BLOCK START
        $response = $this->actingAs($newUser)
                         ->withSession($newUserSessionData)
                         ->get('profile/view');
        $response->assertStatus(200);
        $response->assertSee( htmlspecialchars('Modified : ' . $newUser->last_name) );

        // 8. OPEN PROFILE DETAILS VIEW PAGE AFTER MODIFICATIONS BLOCK END

添加了新用户,并且可以正常打开“个人档案视图”页面,但是在步骤// 7出现了问题。修改个人档案详细信息页面开始 正如我在sql trace中看到的那样,新用户已插入但未更新。

在我的控件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

可以决定添加文件app / Http / Middleware / VerifyCsrfToken.php

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        // ???
    ];

如果在命令行中,我以

运行测试
  vendor/bin/phpunit   tests/Feature/ProfilepageTest.php

除了我还能添加什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

除了PATCH而不是POST之外,我还建议您测试代码。

代替ProfileUserDetailsRequest尝试使用简单的Request。

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

制作一个用户表模型,然后尝试使用该模型更新用户

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

会话由中间件启动,我认为如果您禁用中间件,则会话将无法工作。

答案 1 :(得分:0)

如果您使用的是Visual Studio Code之类的IDE来运行您的代码,请尝试使用xdebug之类的调试器。在您的update_details方法中放置一个断点,查看它是否要保存并且保存正在执行。如果是,那么我们知道保存未正确更新。

根据更新文档,您似乎在做正确的事情: https://laravel.com/docs/5.7/eloquent#updates来自以下文档的示例:

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

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

$flight->save();

我最担心的是为什么失败,我唯一的猜测就是让用户脱离auth对象会导致问题。从用户的auth对象中获取ID,然后使用find()来捕获用户,然后更新其值并保存并查看是否有效。