#laravel #tdd
#laravel #tdd
Вопрос:
Я пытаюсь проверить, совпадает ли текущий пароль с тем, что указан в DB.
мой упрощенный контроллер:
class ChangePasswordController extends Controller
{
public function update(Request $request, User $user)
{
$this->validate($request, [
'current_password' => ['required', new CurrentPassword()],
'password' => 'required|string|min:6|confirmed'
]);
$user->update([
'password' => bcrypt($request->password)
]);
}
}
в моем пользовательском правиле CurrentPassword я проверяю хэш следующим образом:
class CurrentPassword implements Rule
{
public function passes($attribute, $value)
{
$check = Hash::check($value, auth()->user()->password);
dump($check);
return $check;
}
public function message()
{
return 'Current password is incorrect.';
}
}
и мой тест для пользовательского правила:
/** @test */
public function an_authenticated_user_may_change_own_password()
{
$this->withoutExceptionHandling();
$user = factory(User::class)->create([
'password' => '1234'
]);
$this->actingAs($user)->patch("/profile/{$user->id}/password", [
'current_password' => '1234',
'password' => 'mynewpassword',
'password_confirmation' => 'mynewpassword'
]);
$this->assertTrue(Hash::check('mynewpassword', $user->fresh()->password));
}
к сожалению, я получаю сообщение об ошибке:
1) Тесты Feature UpdatePasswordTest::an_authenticated_user_may_change_own_password Освещают Validation ValidationException: данные данные были недействительными.
я не понимаю, почему это происходит. Мой dump($check);
возвращает false при запуске этого теста. Мое значение $ равно ‘1234’, а auth()-> user()->password также возвращает ‘1234’. Может быть, у кого-нибудь есть идея, что я делаю неправильно.
этот тест становится зеленым:
/** @test */
public function current_password_must_be_valid()
{
$user = factory(User::class)->create([
'password' => '1234'
]);
$this->actingAs($user)->patch("/profile/{$user->id}/password", [
'current_password' => '12345',
'password' => 'mynewpassword',
'password_confirmation' => 'mynewpassword'
])->assertSessionHasErrors('current_password');
}
Ответ №1:
Вы также должны хэшировать свой пароль на своей фабрике, иначе Eloquent сохранит его в виде открытого текста (вот почему auth()->user()->password
возвращает ‘1234’)
public function current_password_must_be_valid()
{
$user = factory(User::class)->create([
'password' => Hash::make('1234'); // remember to import the Hash facade
]);
...
}
Комментарии:
1. Я обновил свой тест, но я все еще становлюсь красным.
"$2y$04$C8lenwCy6SwJqFsuEcw0LOQpo/jeqGOCkgys2i/NUWzsaBuE3kVTW" "$2y$04$C8lenwCy6SwJqFsuEcw0LOQpo/jeqGOCkgys2i/NUWzsaBuE3kVTW" false
. Это мои дампы ($value // auth()-> user()->password // Hash::check) в пользовательском правиле.2.
Hash::check
будет проверяться обычный текст, поэтому$value
должен быть открытый текст. В вашем случае кажется, что вы его хэшировали (поэтому он будет хэшировать хэш), так что, на всякий случай, это должно пройти:Hash::check('1234', auth()->user()->password)
в вашем пользовательском правиле, верно?3. вы правы. Значение $ также было хэшировано, и поэтому тест был красным. Спасибо!