2017-09-29 7 views
0

私は、その目的がデータベース接続をテストする機能を記述しようとしています。それは、Databaseオブジェクトをインスタンス化し、データベースに接続して結果を返そうとします。PHPUnitを使ってオブジェクトをインスタンス化する関数を模擬してテストするには?

擬似コードは、この

<?php 

function testDatabaseLogin() { 
    // Get the database connection information from a file 
    // ... 

    // Database is a class which stores the connection information passed, 
    // When its connect() method is invoked, it tries to connect. nothing fancy 
    $conn = new Database($host, $port, $username, $password); 
    return $conn->connect(); // TRUE on success, FALSE otherwise 
} 

?> 

のように見えるこのコードスニペットは、私の状況を簡略化したバージョンですが、それは私の質問を説明するのに十分でなければなりません。

この例では、PHPUnitを使用してDatabaseクラスを模擬する方法を知りたいと思います。私が欲しいのは、私が実際に試行する必要がないように、私は、この関数からDatabaseをインスタンス化することはconnect()を制御するために

  • スタブDatabase正しい引数は、TRUEまたはFALSE

    1. アサートを返すためにできることです実際のデータベースに接続する

    私は検索しましたが、PHPUnit Mockオブジェクトがこのように動作しないようです。どんな助けもありがたいです。一番下の行では、テストを簡単にするのに役立つ場合は、関数の実装を変更することができます。

    ありがとうございます。

  • +0

    これが役立つかどうかわかりませんが、私はPDO接続(https://stackoverflow.com/questions/46379109/testing-coverage-with-phpunit-and-pdo)を嘲笑することに関係する質問をしました。合理的な値のためにパラメータを検証する必要があるかもしれませんが、実際に有効であることを確認することはできません。 –

    +0

    @NigelRenご協力いただきありがとうございます。あなたの 'DBAccess'クラスが' PDO'オブジェクトを受け入れるので私の状況はあなたとは違うと思います。したがって、PHPUnitを使用して 'PDO'オブジェクトをモックして渡すことができます。しかし、私の場合、 'Database'オブジェクトは関数内でインスタンス化されています。つまり、モックオブジェクトを持っていても、内部に渡す方法はありません。 PHPUnitがこのケースを処理できない場合は、関数をリファクタリングしてテスト可能にする必要があります。 – user7509214

    +0

    私は、一般的なコンセンサスは、テストなどを可能にするための依存関係を注入できることだと思う、https://stackoverflow.com/questions/130794/what-is-dependency-injectionはもっと多くの詳細を与える。 –

    答えて

    0

    私はあなたのクラスを拡張し、 "テスト対象クラス" を作成し、その後、時々

    <?php 
    class MyClass 
    { 
        public function databaseLogin() { 
         $conn = $this->createDatabase(); 
          return $conn->connect(); // TRUE on success, FALSE otherwise 
         } 
    
        protected function createDatabase() { 
         new Database($host, $port, $username, $password); 
        } 
    } 
    

    を使用しましたトリックがあります:

    :テストでは、その後、

    class MyClassUnderTest extends MyClass 
    { 
        public function __construct($databaseMock) 
        { 
         $this->databaseMock = $databaseMock; 
         parent::__construct(); 
        } 
    } 
    

    とは

    class MySuperTest 
    { 
        public function testSomethingWitDatabase() 
        { 
         $databaseMock = $this->getMockBuilder(DataBase::class) 
          ->disableOriginalConstructor() 
          ->getMock(); 
    
         $classUnderTest = new MyClassUnderTest($databaseMock); 
         $this->assertTrue($classunderTest->databaseLogin()); 
        } 
    } 
    

    したがって、テスト用に作成したクラスによって上書きされるメソッドにDatabaseオブジェクトをインスタンス化します。

    +0

    とにかく、より確かなコードを得るために依存性注入を使うのが良いでしょう... –

    関連する問題