2016-06-26 12 views
2

私はアプリの単体テストを書いており、requireのメソッドをテストしたいと思っていました。私はテストケースにはユニットテストが必要です

public $configPath = __DIR__.'/path/to/config.php'; 

private function getConfig() 
{ 
    if (!empty($this->config)) { 
     return $this->config; 
    } 

    return $this->config = require $this->configPath; 
} 

public method foo() 
{ 
    $config = $this->getConfig(); 
    //logic here 
} 

それを見る方法は、それぞれのスニペットは、適切な方法または他の技術/ソリューションを使用する必要があり、これは考えることができる場合、私は疑問に思って

$class->config = ['bar' => 'baz']; 

$class->foo(); 

のですか?

答えて

1

requireステートメントは、ファイルシステムからファイルを読み込みます。インフラストラクチャと相互作用するため、ユニットテストではなく統合テストを行う必要があります。しかし、ファイルシステムから分離する方法がありますので、適切に単体テストできます。

統合テスト

あなたのクラスのための統合テストを書くことにした場合は、コンストラクタの引数を経由して設定ファイルへのパスが設定可能にすることができます。こうすることで、テストで頼りにできる値を持つ "テスト"設定ファイルを渡すことができます。

ユニットテスト

あなたはあなたのクラスのうち、ファイルのロードを移動する必要があると思いますユニットテストを書くことにした場合。 configファイルをコンストラクタ引数として読み込んだ結果を渡すか、ファイルの読み込みを共同編集者に委譲します(つまり、ConfigLoader)。ユニットテストでConfigLoaderをスタブすることができます。 ConfigLoaderの実装は非常に簡単で、ファイルの読み込みと配列の返されたかどうかを確認するための統合テストを作成します。例えば

class ConfigLoader 
{ 
    public function load($file) 
    { 
     $config = require $file; 

     if (!is_array($config)) { 
      throw new InvalidConfigFileException(sprintf('Did not find configuration in "%s".', $file)); 
     } 

     return $config; 
    } 
} 

アプローチを選択するには?

これは、テストしようとしているconfigクラスの責任(単一責任原則を覚えておいてください)によって異なります。

configクラスの責任が設定ファイルの読み込みにのみ関連している場合 - 統合テストを行います。それ以上のものがある場合は、ファイルの読み込み責任を自分のクラスに抽出します。

+0

これは 'integration'テストのためにそのまま残すべきだと思いますか?つまり、ユーザーが特定の「キー/値/何でも」を提供せず、アプリケーションがクラッシュする場合はどうでしょうか? – sitilge

+0

あなたの意見では、私は統合アプローチに進むべきですか? :) – sitilge

+0

あなたの設定クラスにどれくらいのロジックがあるかによって異なります - このクラスの責任は何ですか?純粋にファイル統合テストをロードする場合は、それをテストします。それ以上のことがあれば、自分のクラスに責任を負うことができます。 –

関連する問題