Тестирование обновления данных профиля пользователя - PullRequest
0 голосов
/ 18 октября 2018

Я выполняю тесты http в своем приложении Laravel 5.7 со страницей профиля (которая имеет страницу «Просмотр профиля» и редактор «Сведения о профиле»), например:

        $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, новый пользователь вставлен, но не обновлен.

В моем управляющем приложении / 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:

Я пробовал метод исправления, ноэто не работает в любом случае.У меня есть метод отладки в моем приложении / Http / Controllers / ProfileController.php

public function update_details(ProfileUserDetailsRequest $request)
{

метод, и когда тест запущен, я вижу, что он не запущен.Я использую тот же метод update_details, обновляющий мою форму в браузере, и он работает нормально (я тоже вижу отладочную информацию).

Я полагаю, это может быть проблемой 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 голосов
/ 27 октября 2018

Кроме PATCH вместо POST, ниже приведены мои рекомендации для проверки вашего кода.

Вместо ProfileUserDetailsRequest попробуйте использовать простой Request.

Попробуйте зарегистрировать переменную $ request в вашей функции обновленияи проверьте, доступны ли _token и _method, должен быть метод PATCH и правильно ли опубликованы переменные запроса.

Создайте модель таблицы пользователя и попробуйте обновить пользователя с этой моделью, используя

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

Сеансы инициируются с помощью промежуточного программного обеспечения, я думаю, что если вы отключите промежуточное программное обеспечение, сеанс не будет работать.

0 голосов
/ 26 октября 2018

Если вы используете IDE, например Visual Studio Code, для запуска своего кода, попробуйте использовать отладчик, такой как 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 и используйте find (), чтобы получить пользователя, затем обновить его значения и сохранить и посмотреть, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...