関数には必ず目的があります!
もっと端的にいえば、引数(@param)と戻り値(@return)があります。
「この引数を渡すと、こういう戻り値が返ってくる」のが関数です。
さて話しは UnitTest になります。目的のある関数を確認するために作成するのがUnitTestです。
UnitTest の目的は「関数は目的を達成しているか?」ということになります。
サンプルを見ていきましょう!
関数は Laravel で作った User.php
を想定しています!
/**
* existsUser
* @param string $email
* @param string $password
* @return bool
*/
public static function existsUser(string $email, string $password) : bool
{
$count = self::where('email', $email)->where('password', Hash::make($password))->count();
return $count > 0;
}
UserTest.php
を作るとしたら、何を確認したらいいでしょうか?
そうです!「この引数のときは true
、この引数のときは false
が返ってくること」を確認できればいいですね!
/**
* testExistsUser
*
* @return void
*/
public function testExistsUser()
{
$this->seed();
$this->assertTrue(User::existsUser('aaa@sample.com', 'aaaa'));
$this->assertFalse(User::existsUser('bbb@sample.com', 'bbbb'));
}
この関数だったら、true
と false
でチェックすることができます。
さて、それでは、次の関数の目的はなんでしょうか?
/**
* getUser
* @param string $email
* @param string $password
* @return User|null
*/
public static function getUser(string $email, string $password) : ?User
{
$result = self::where('email', $email)->where('password', Hash::make($password))->first();
return $result;
}
UserTest.php
を作るとしたら、何を確認したらいいでしょうか?
そうです!「この引数のときは User
が取得できて、この引数のときは User
が取得できないこと」を確認できればいいですね!
/**
* testGetUser
*
* @return void
*/
public function testGetUser()
{
$this->seed();
$result = User::getUser('aaa@sample.com', 'aaaa');
$this->assertNotNull($result);
$this->assertEquals(1, $result->id);
$this->assertNull(User::getUser('bbb@sample.com', 'bbbb'));
}
NotNull
と Null
で取得できたかできないかをまず確認して、いちおうID
も確認してみました。
「他のカラムを確認しなくてもいいのか?」っていうのは、これは好き好きかと思います!
結局、データベースに登録したデータをそのまま抜き出しているだけですので、もし重要なカラムがあるようでしたら、IDと同じように、 assertEquals
で確認するといいと思います!
データが登録されたことを確認する場合は、 assertDatabaseHas
が使いやすいです!
/**
* testUpdateUserEmail
*
* @return void
*/
public function testUpdateUserEmail()
{
$this->seed();
User::updateUserEmail(1, 'aaa@sample.com');
$this->assertDatabaseHas('users', ['id' => 1, 'email' => 'aaa@sample.com');
User::updateUserEmail(1, 'bbb@sample.com');
$this->assertDatabaseHas('users', ['id' => 1, 'email' => 'bbb@sample.com');
}
assertDatabaseHas
は、第1引数のテーブルに、第2引数の参照をしたときにデータが存在するのかチェックしてくれる関数です。
更新系の処理は、UnitTestを作成する際には、複数回実行してみるといいと思います!