2016-04-25 6 views
1

私はすべてのアプリケーション構成を持つ構成ファイル "config.ini"を読み込むメソッド "getConfig"を持つ "構成"クラスを持っています(データベースの資格情報とホスト、 .....)構成ファイルを読み込んでいるクラスのユニットテスト

今のところ私は、データベースエントリが設定ファイルに存在するかどうかをテストすると同時に、 "getConfig"メソッドによって返された配列がキーを持っていることを確認するこのユニットテストを持っています"データベース":

function testConfigFileHasDatabaseEntry() 
{ 
    $configuration = Configuration::getInstance(); 
    $arrConfig = $configuration->getConfig(); 
    $this->assertArrayHasKey('database', $arrConfig); 
} 

"getConfig"がarray型の変数を返すことを確認する別の単体テストもあります。

私の質問は次のとおりです:ユニットテストのベストプラクティスに関しては、この場合、getConfig関数が十分にテストされているかどうかを確認するのに十分なテストか、すべてのキーが設定ファイルに存在することを確認する方が良いでしょう。私は、すべてのエントリがconfigファイルにあるかもしれないことを確認することは、テストの別のカテゴリに該当するかもしれないと確信していますが、私は確信しています。

この場合のベストプラクティスを教えてください。 gcontrollezの答えに

ベースは、私はクラスのソースコードを掲載した方がよい実現:あなたはgetConfigメソッドをテストユニットではありません

<?php 
/** 
* Loads the configuration file 
*/ 

namespace Example\Lib; 

class Configuration { 

    private static $instance; 

    private $arrConfig; 

    /** 
    * Constructor: loads the config file into property arrConfig and dies if unable 
    * to load config file 
    * 
    * @return void 
    */ 
    private function __construct() 
    { 
     $this->arrConfig = parse_ini_file("config/settings.ini", true); 
     if ($this->arrConfig == false){ 
      die("Cannot load configuration file"); 
     } 
    } 

    /** 
    * returns an instance of this singleton class 
    * 
    * @return Configuration 
    */ 
    public static function getInstance() 
    { 
     if (self::$instance == null){ 
      self::$instance = new Configuration(); 
     } 
     return self::$instance; 
    } 

    /** 
    * Getter for the property arrConfig 
    * 
    * @return array: 
    */ 
    public function getConfig() { 
     return $this->arrConfig; 
    } 

} 

おかげ

答えて

0

を。その結果に特定のデータが含まれているかどうかだけチェックしています。これは完全に有効であり、有用かもしれませんが単体テストではありません。

getConfigメソッドをユニットテストする場合は、可能な各config.iniファイルの動作をチェックする必要があります。 getConfigの中にparse_ini_file関数を使用しているとします。だから、あなたはそれが起こることができると思う、すべての可能なケースをチェックする必要がありますgetConfig方法ユニットテストのために:

- testConfigFileIsLoaded 
- testExceptionThrownIfConfigFileFailsToLoad 

parse_ini_fileので、これらはあなたがチェックしなければならない場合もある配列またはfalseを返します。

そのためには、使用する.iniファイルを変更する必要があります。それがConfigurationクラス内でharcodedの場合、あなたはそれを行うことができません。

+0

私はあなたの答えが好きです。私は自分のConfigurationクラスをチェックしましたが、ファイルをロードできないときはただのダイスでした。あなたが示唆しているように、明らかに例外はかなり良いです。私はそれを行います。ハードコーディングされた設定ファイルについてのあなたの点に関して、私はこのクラスでハードコードしないと、ホールアプリケーションを通じて1つの設定ファイルしか使用していません。コンストラクタのパラメータとそれをすべての呼び出しコードに置くことをお勧めします。設定ファイルの名前を指定しますか?それはコードの不要な結合ではないでしょうか?それとも良い方法がありますか?私は今のようにソースクラスを投稿しています。 –

+0

クラスを単体テストする場合は、最も適切なのは '.ini'ファイルをコンストラクタに渡して引数として渡すことで、クラスの動作を' .ini'ファイルで確認できます。次に、 'Configuration'クラスを作成するときにファイル名をハードコーディングします。この方法で、他のプロジェクトでクラス(およびそのテスト)を再利用できます。最後の注意:テストでは、実際の '.ini'ファイルを使うべきではありませんが、良い例としてふさわしい別のものを使うべきです。 – gontrollez

関連する問題