web-dev-qa-db-ja.com

テスト用にのみ存在するコードが必要ですか?

リポジトリのインスタンス化と使用を担当するサービスクラスがあります。それは、理想的にはテストのためにモックしたい外部Httpリクエストを作成します。ただし、これを行うための最善の方法はよくわかりません。

たとえば、現在、クラスは次のようになっています。

public function lookUp($identifier)
{
    $client = new Curl();
    $data = $this->provider->lookUp($identifier, $client);

    // do stuff w the response
}

メソッド内に含まれているため、Http応答をモックすることはできません。

別の方法は、次のようなことを行うことです。

public function lookUp($identifier, $client = null)
{
    if ($client === null) {
        $client = new Curl();
    }

    $data = $this->provider->lookUp($identifier, $client);

    // do stuff w the response
}

そして、テストでモックするための$ clientを持つことができます。ただし、これは、テストの目的のためだけにコードを変更(および混乱)させることを意味します。

私はこれをすべきですか?これをテストするためのより良い方法はありますか?

2
tam5

それは視点の問題です。コードのテストを作成すると、コードを切り離す必要があります。これを「テスト専用のコード」と見なすことができますが、これは誤解を招くと思います。

実際に行っているのは、コードを分離することです。あなたはハードな依存関係を取り除き、必要なものすべてをnewsするコードに伴う頭痛の種を取り除きます。これらはそれ自体が望ましい目標です。また、コードがよりテスト可能になるという効果もあるので、どちらの方法でも見ることができます。

コードをテスト可能にするには、コードが「適切」である必要があります(非常にずさんな方法で使用されているため、あらゆる分野が悪用されて混乱を引き起こす可能性があることを認識しています)。コードが「良好」であるためには、テスト可能である必要があります(少なくとも大部分で)。

自動回帰テストを使用するか、後で変更やリファクタリングを容易にする設計を使用するなど、好きなものを選択できます。

12
sara