Если вы проверите ответ с помощью dd($response)
, вы увидите, что Laravel жалуется на недействительный токен.
Но почему?- Laravel не хранит точный токен в базе данных.Он хранит хэш токена.Это сделано для того, чтобы тот, кто получил доступ для чтения к базе данных, не мог (легко) сбросить пароли пользователей.
Поэтому вместо получения хеша из базы данных вы хотите получить токен, отправляемый пользователю.
Давайте попробуем извлечь токен из уведомления:
$bag = new \stdClass();
Notification::assertSentTo($user, \Illuminate\Auth\Notifications\ResetPassword::class, function ($notification) use ($bag) {
$bag->token = $notification->token;
return true;
});
$token = $bag->token;
и поставить его в тест:
/** @test */
public function does_change_a_users_password()
{
Notification::fake();
// Create user
$user = factory(User::class)->create();
// This post route creates a new password reset token and stores it into the database.
$this->post(route('password.email'), ['email' => $user->email]);
// get the password reset token
$bag = new \stdClass();
Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($bag) {
$bag->token = $notification->token;
return true;
});
$token = $bag->token;
$this->from(route('password.reset', $token));
// Change password with the correct data
$response = $this->post('password/reset', [
'token' => urlencode($token),
'email' => $user->email,
'password' => 'password',
'password_confirmation' => 'password'
]);
//$response->assertSessionHasErrors('password');
// Ensure password is changed.
$this->assertTrue(Hash::check('password', $user->fresh()->password));
}