如何编写 Laravel 更新密码表单的测试?

Lin*_* Lg 6 phpunit laravel laravel-5

如何为 Laravel 更新密码表单编写 phpunit 测试?

这是我的测试:

$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')]);
Run Code Online (Sandbox Code Playgroud)

密码控制器正在保存新密码,如下所示:

....
$user->password = \Hash::make($request->new_password);
$user->save();
....
Run Code Online (Sandbox Code Playgroud)

我收到错误:“无法断言表 [user] 中的行与属性匹配”

更新密码表单工作正常,因为我可以使用更新的密码登录。我猜想: $this->assertDatabaseHas('users', ['name' => $user->name, 'password' => \Hash::make('newone')]); 正在创建与我的密码控制器不同的密码。

任何想法,这里出了什么问题?

Bar*_*art 7

正如@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));
Run Code Online (Sandbox Code Playgroud)

这应该会让你的测试顺利......


Lat*_*san 1

这里没什么问题。Hash::make()对于相同的密码,将生成不同的值 - 这是由于底层实现造成的。请参阅http://php.net/manual/en/function.password-hash.php

这是一种安全措施,可以防止彩虹表攻击。 https://en.wikipedia.org/wiki/Rainbow_table