BETA

LaravelのPHPUnitテスト機能で、自身のアプリのパスワード変更機能をチェックする方法

投稿日:2020-02-18
最終更新:2020-02-18

assertDatabaseHasではパスワードの一致確認ができない。

LaravelのPHPUnitテスト機能を使って自身のアプリの会員情報変更機能のテストする時に、データベースの値が変わったかチェックするためにassertDatabaseHasを使うと思います。ユーザー名やメールアドレスではこれで問題ないです。
しかし、パスワードの場合、(Hash::makeを使うと思いますが、)格納するたびにハッシュ値が変わるので、assertDatabaseHasでは一致確認ができません。

Hash::checkを使ってパスワードの一致を確認する。

格納されたパスワードの一致を確認するには、Hash::checkを使います。
例えば、下記のような使い方です。(構文は公式ドキュメントを参照。)

$user = factory(User::class)->create();  
$input = Str::random(8);  

$this->actingAs($user)->put('/home/settings/password/' . $user->id, ['password' => $input, 'password_confirmation' => $input])  
                      ->assertSessionHas('message', '変更が完了しました。');  
$this->assertTrue(Hash::check($input, $user->password));  

Hash::checkの返り値はbooleanです。
実は、上記コードでうまくいかず悩んだので、記事にしました。
このまま実行すると、Hash::checkでfalseが返ってきます。3行目についてはエラーは出ていなかったので、パスワードは変更できているはずなのにです。

インスタンスの更新も必要

モデルインスタンスは古いパスワード情報を持ったままの状態なので、refreshをすることで、新しいパスワード情報を持った状態になります。Hash::checkの前にインスタンスの更新としてrefreshを入れます。

$user = factory(User::class)->create();  
$input = Str::random(8);  

$this->actingAs($user)->put('/home/settings/password/' . $user->id, ['password' => $input, 'password_confirmation' => $input])  
                      ->assertSessionHas('message', '変更が完了しました。');  
$user->refresh();  
$this->assertTrue(Hash::check($input, $user->password));  

これでテストがエラーなく通るようになりました。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

あろはの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう