関数の目的を考えたUnitTestを考えよう!

都会を泳ぐ魚
都会を泳ぐ魚 フリー素材ぱくたそ(www.pakutaso.com)
  • URLをコピーしました!

関数には必ず目的があります!
もっと端的にいえば、引数(@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'));
}

この関数だったら、truefalse でチェックすることができます。

さて、それでは、次の関数の目的はなんでしょうか?

/**
 * 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'));
}

NotNullNull で取得できたかできないかをまず確認して、いちおう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を作成する際には、複数回実行してみるといいと思います!

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次