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')]); 正在创建与我的密码控制器不同的密码。
任何想法,这里出了什么问题?
正如@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)
这应该会让你的测试顺利......
这里没什么问题。Hash::make()对于相同的密码,将生成不同的值 - 这是由于底层实现造成的。请参阅http://php.net/manual/en/function.password-hash.php
这是一种安全措施,可以防止彩虹表攻击。 https://en.wikipedia.org/wiki/Rainbow_table
| 归档时间: |
|
| 查看次数: |
3730 次 |
| 最近记录: |