如何为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')]);
密码控制器正在保存新密码:
....
$user->password = \Hash::make($request->new_password);
$user->save();
....
我收到错误:"声明表[users]中的行与属性匹配失败"
更新密码表格工作正常,因为我可以使用更新的密码登录。我猜,那个:$ this-> assertDatabaseHas(' users',[' name' => $ user-> name,' password' => ; \ Hash :: make(' newone')]);正在使用不同于我的密码控制器的密码。
任何想法,这里有什么问题?
答案 0 :(得分:1)
这里没有错。对于相同的密码,Hash::make()
将生成不同的值 - 这是由于底层实现。见http://php.net/manual/en/function.password-hash.php
这是一种安全措施,它可以防止彩虹表攻击。 https://en.wikipedia.org/wiki/Rainbow_table
答案 1 :(得分:1)
由于@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));
这应该可以使你的测试正常......
答案 2 :(得分:0)
这里的每个人都是对的。你可以看到另一个简单的例子:
$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');
度过愉快的一天。