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

时间:2018-05-16 21:12:56

标签: laravel laravel-5 phpunit

如何为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')]);正在使用不同于我的密码控制器的密码。

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

3 个答案:

答案 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');

度过愉快的一天。