PHPで依存関係を持つメソッドを単体テストする方法は?

php unit-testing
PHPで依存関係を持つメソッドを単体テストする方法は?

いくつかのロジックを含むメソッドがあり、単体テストの方法がわかりません。 この特定のメソッドの単体テストであるため、データベースに接続せずに実行する必要があります。 スタブとモックアップについて読みましたが、それらをこの状況に適用する方法が見つかりません。

各ロジックブランチをテストできるように、Client:GetClientに適切なプロパティを持つクライアントオブジェクトを強制的に返させたいと思います。

class ClientType {
    function GetClientType($id) {

    $objClient = Client::GetClient($id);

    if ($objClient->Returning == 1) {
        return 'returning';
    }
    else {
        return 'normal';
    }
    }

これは私が念頭に置いていたテストです

class ResourceTest extends PHPUnit_Framework_TestCase {
    function testGetClientType() {
        $objClientType = new ClientType();
        $this->assertTrue($objClientType->GetClientType(100), 'normal');
    }
}
問題は、依存関係$ objClient = Client

GetClient($ id);です。 GetClientはデータベースからクライアントを取得しますが、データベースに実際にアクセスしなくても単体テストが機能するように、これをスタブに置き換える必要があります。

結論

提示されたようなコードがある場合:それをリファクタリングし、依存性注入を使用します。

レガシーコードがある場合、またはリファクタリングしたくない場合は、次のソリューションを試してください:http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html

  3  0


ベストアンサー

PHPUnitを使用すると、次のことができます。

  $class = $this->getMockClass(
      'Client',          /* name of class to mock     */
      array('getClient') /* list of methods to mock   */
    );
    $class::staticExpects($this->any())
          ->method('getClient')
          ->will($this->returnValue('foo'));

一般的に、静的メソッドは避けたいものです:

” ” ‘

更新後に編集

PHPUnitは、ハードコードされた依存関係をスタブ化することもできます。 See

ただし、静的およびハードコードされた依存関係をテストするのは痛みであることにすでに気付いているので、代わりにClientTypeに注入する実際のオブジェクトを使用して、ハードコードされた依存関係および静的呼び出しを削除することをお勧めします。

別のオプションは、http://antecedent.github.io/patchwork(それとは関係ありません)を使用することです。

_
は、実行時にユーザー定義関数とメソッドを再定義できるようにするPHPライブラリです。純粋なPHP 5.3コードのrunkit_function_redefine機能を大まかに複製します。これにより、静的メソッドとプライベートメソッドをテストダブルに置き換えることができます。
_

5


この種の問題については、モッキングを試してください。 PHPはわかりませんが、このようなシナリオではJavaとC#でモックを行います。

編集

あなたがモックの問題に直面しているのを見ていなかったのは残念です。 まあ通常はモックのためにあなたは彼らにあなたが彼らに期待するものを伝え、彼らは同じに応答します。 モックではLSV原理が使用されています。 PHPについては、モックに使用するツールとそれらの使用方法についてわからない

0


タイトルとURLをコピーしました