浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

PHPの単体テストを行いやすくするコンストラクター・インジェクション

 コンストラクター・インジェクションはコンストラクタで依存性をインジェクション(注入)する方法のことです。何の気なしに次の様なコードを書いた場合、そのコードには依存関係が発生します。

public static function createNewMember(Request $request)
{
    $new_member = new Members();
    // $new_memberをどうこうするコード
}

 このコードはMembersの実装に依存しています。Membersの中身が変更された場合、createNewMemberが壊れる場合があります。壊れた場合、createNewMember内部に問題が無いにもかかわらずテストが失敗し、createNewMemberを探る羽目になります。そのためにnew Members()と呼ぶのでなく手製のテスト用オブジェクトをcreateNewMemberに渡せるようにします。この渡す手法の一つがコンストラクター・インジェクションです。
 コンストラクター・インジェクションの方法は次の通りです。

class MemberController
{
    public function __construct(Members $member = null)
    {
        $this->member = $member ?? new Members();
    }

    public function createNewMember(Request $request)
    {
        $new_member = $this->member;
        // $new_memberをどうこうするコード
    }
}

 コンストラクタで引数としてMembersオブジェクトを渡すか、新たにインスタンスを作るかして、それを自身のプロパティに保持します。こうすることで依存性のあったコードのクラスインスタンス化した際にテスト用オブジェクトを渡してテストを行うことが出来ます。このテストはMembersクラスに依存していない為Membersクラスの変更によってテスト中のcreateNewMemberが壊れることはありません。

  • この記事いいね! (0)