Как написать тест для формы обновления пароля Laravel? - PullRequest
0 голосов
/ 17 мая 2018

Как написать тест phpunit для формы пароля обновления Laravel?

Вот мой тест:

$user = \factory(\App\User::class)->create(['password' => \Hash::make('password')]);
        $this->actingAs($user);  

        $response = $this->call('PUT', '/user/update-password', array(
            '_token' => csrf_token(),
            'current_password' => 'password',
            'new_password' => 'newone',
            'repeat_new_password' => 'newone',
        ));
        $response->assertStatus(302);        

        $this->assertDatabaseHas('users', ['name' => $user->name, 'password' => \Hash::make('newone')]);

И контроллер пароля сохраняет новый пароль, например:

....
$user->password = \Hash::make($request->new_password);
$user->save();
....

И я получаю ошибку: "Не удалось утверждать, что строка в таблице [пользователи] соответствует атрибутам"

Форма обновления пароля работает нормально, потому что я могу войти с обновленным паролем,Я предполагаю, что: $ this-> assertDatabaseHas ('users', ['name' => $ user-> name, 'password' => \ Hash :: make ('newone')]);делает другой пароль, чем мой контроллер паролей.

Есть идеи, что здесь не так?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Как подсказал @Latheeesan Hash:make() дает разные результаты ...

Поэтому используйте Hash::check(... для него, как в этом примере:

$oldPassword = 'password';
$newPassword = 'newone';  

$user = \factory(\App\User::class)->create(['password' => \Hash::make($oldPassword)]);

$this->actingAs($user);  

$response = $this->call('PUT', '/user/update-password', array(
    '_token' => csrf_token(),
    'current_password' => $oldPassword,
    'new_password' => $newPassword,
    'repeat_new_password' => $newPassword,
));
$response->assertStatus(302);        
$this->assertTrue(\Hash::check($newPassword,$user->password));

Это должно сделать ваш тест в порядке ...

0 голосов
/ 17 мая 2018

Все здесь правы.Вы можете увидеть еще один простой пример:

$validator = Validator::make($request->all(), User::$password_rules);
    if ($validator->fails()){
        return Redirect::back()->withErrors($validator)->withInput();
    }
    $user=Auth::user();
    if(Hash::check($request->get('password'), $user->password)){    
        $user->password=bcrypt($request->get('newpassword'));
        $result=$user->update();
        if($result){
            return Redirect::back()->with('status', 'Password updated');
        }
        return Redirect::back()->with('status', 'Password could not be updated');
    }
    return Redirect::back()->with('status', 'Current password is wrong');

Хорошего дня.

0 голосов
/ 17 мая 2018

Здесь все в порядке.Hash::make() создаст другое значение для одного и того же пароля - это связано с базовой реализацией.См. http://php.net/manual/en/function.password-hash.php

Это мера безопасности, предотвращающая атаку радужного стола.https://en.wikipedia.org/wiki/Rainbow_table

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