3

クラス内に次のような簡単なメソッドがあります

 class ToBeTested
 {
      public function getLocalSettings()
      {
          require_once 'local.php';

           return (isset($configSetting['foo'])) ? true : false;
      }
 }

local.phpで

 <?
      $configSetting = array(
           'foo' => '1',
           'bar' => 'false',
      );

getLocalSettingsの単体テストを作成しようとしています。これは依存性注入のようなものだと思いますが、テストの書き方に頭を悩ませることはできません。テストで過度に複雑になるのはかなり些細なコードのブロックのようですが、ここでリファクタリングする自由があり、テスト目的で「local.php」を独自の値/データプロバイダーに置き換えたいと思います

明確さ/コメントのために編集

ここではサンプルとして構成を使用しましたが、実際に使用しているのは、データベースから出力され、データソースとして含まれ、この関数で解析される巨大なファイルです。質問が複雑になりすぎないように、簡略化したバージョンを作成しましたが、含まれている配列は数メガバイトであり、実際には「構成ファイル」ではありません。残念ながら、ファイル構成を処理する際にさまざまなアプローチを提供するソリューションは役に立ちませんが、この配列を挿入する方法は問題なく機能します(ただし、ある時点で、その「require」を実行する必要があります。

ありがとう

4

1 に答える 1

4

ToBeTestedコンストラクターまたはセッターのいずれかを介して、構成配列をクラスに挿入する必要があります。これにより、(別のファイルが含まれる)ことによって引き起こされる副作用がなくなり、getLocalSettingsテスト中に設定をモックすることができます。クラス定義は次のようになります。

class ToBeTested
{
    private $localSettings;

    public function __construct($localSettings)
    { 
        $this->localSettings = $localSettings;
    }
}

次に、通常の使用でこのクラスをインスタンス化するときは、コンストラクターに構成配列を提供するだけです(local.phpブートストラップコードに含める必要があります)。クラスを単体テストする場合は、インスタンス化するときに必要な設定のセットを挿入でき、ファイルシステムに強く依存する必要はありません。これには、PHPUnit(ドキュメント)のデータプロバイダー機能を使用することを選択できます。

于 2013-03-04T19:29:56.467 に答える