
- なぜnot笑しませんか
- 主な利点は構文です
- moki-ネイティブ
- スタブオブジェクトの作成
- 湿潤クラスのプロパティ
- モックインジェクション
- Reflectionを使用する便利な方法
- プロジェクトに追加する方法
なぜあざけるな
PHPUnitは、PHPの世界で単体テストを作成するための標準的な最も一般的なフレームワークです。 当然のことです-彼は彼に割り当てられた義務にうまく対処します。 しかし、モックオブジェクトを作成するための標準的な構文について言えば、多くの人がその扱いにくい性質に不満を言っています。 Mockeryなど、モカを作成するためのさまざまなプラグインを提供しています(これは単なるプラグインではないことを理解しています)。
ただし、PHPUnitには、mokaを作成して使用し続けるための十分に開発されたシステムがあると確信しています。 PHPUnitは活発に進化しています。それほど前のことではありませんが、TDDには、モックのトレース、存在しないクラスのモックが追加されました。
そして、このXPMockプロジェクトは、mokを作成する構文を簡素化する方法です。 XPMockは独自のmokaを作成せず、PHPUnit mokaのラッパーを作成しないことを強調する必要があります。 XPMockは同じPHPUnitメソッドを呼び出し、同じmokaを作成しますが、ほんの少しだけ簡単です。
主な利点は構文です
PHPUnitでmok(3つのメソッドを持つスタブオブジェクト)を作成するための標準構文は次のようになります。
$mock = $this->getMockBuilder('MyClass') ->setMethods(['getBool', 'getNumber', 'getString']) ->disableOriginalConstructor() ->getMock(); $mock->expects($this->any()) ->method('getBool') ->will($this->returnValue(true)); $mock->expects($this->any()) ->method('getNumber') ->will($this->returnValue(1)); $mock->expects($this->any()) ->method('getString') ->will($this->returnValue('string'));
単体テストで依存関係のほとんどを濡らす人は、そのような構成のためにテストコードが非常に急速に成長することに気付きます。
XPMockを使用する場合、mokaの作成ははるかに短くなります。
$this->mock('MyClass') ->getBool(true) ->getNumber(1) ->getString('string') ->new();
モキ-ネイティブ
XPMock
-自分のモキを作成しません
-PHPUnitモックの追加ラッパーを作成しません
-すべてのネイティブPHPUnitコンストラクトをサポート
例えば
$mock->getNumber($this->once())
それは書くことと同じです
$mock->expects($this->once()) ->method('getNumber') ->will($this->returnValue(null))
一般的に使用される構造の短い記録の他の例は、ここにあります: github.com/ptrofimov/xpmock
スタブオブジェクトの作成
スタブオブジェクトまたはスタブオブジェクトは、デフォルトではすべてのメソッドが実際のメソッドとオーバーラップし、nullを返すモックオブジェクトです。 PHPUnitの構文では、moki、スタブ、およびそれらのような他のものに分割されていません。 テスト用のすべての人工オブジェクトは、getMockまたはgetMockBuilderを使用して作成されます。
XPMockには、すべてのメソッドがデフォルトでnullを返すモックを返す特別なスタブメソッドが含まれています。 これにより、コードの可読性が向上し、実際のモックを作成するときにsetMethodsメソッドを呼び出す必要がなくなります。
モッククラスプロパティ
PHPUnitはクラスプロパティをモックする方法を知りません。 XPMockも。 ただし、作成されたmokのプロパティをReflection経由で設定する便利な方法を提供します。 mokaの作成時に指定された割り当ては、新しいコンストラクターメソッドを呼び出した直後に実行されます。
$this->mock('MyClass') ->__set('property', $value) ->new();
マジックメソッドを使用せずに、おなじみの構文を使用してプロパティを設定できます。
モックインジェクション
非常に多くの場合、mokaを作成するとき、すぐに他のオブジェクトに埋め込む必要があります。 たとえば、シングルトンのインスタンスを作成し、それへの参照を同じクラスの静的インスタンス変数に埋め込みます。 これは通常、リフレクションによって行われます。 ここのXPMockは、このようなアクションに便利な構文も提供します。
$this->mock('MyClass') ->injectTo($object, 'property') ->new();
Reflectionを使用する便利な方法
XPMockは、Reflectionを介してオブジェクトを操作するための一般的な短い構文も提供します。
たとえば、オブジェクトのプライベートプロパティを取得するには、通常、次のように記述する必要があります。
$property = new \ReflectionProperty('MyClass', 'property'); $property->setAccessible(true); $value = $property->getValue($object);
XPMockでは、次のようにこれを行うことができます。
$value = $this->reflect('MyClass')->property;
この構文を使用すると、オブジェクトの閉じた/開いた静的/非静的プロパティの値を取得したり、プライベートメソッドを呼び出したりできます。
プロジェクトに追加する方法
XPMockは既存のテストに簡単に統合でき、PHPUnitモブを作成するためのネイティブ構文に干渉しません。
オプション1. XPMock特性を既存のテストに追加(PHP> = 5.4に適しています)
class MyTestCase extends \PHPUnit_Framework_TestCase { use \Xpmock\TestCaseTrait; }
オプション2。対応するXPMockクラスからテストクラスを継承します(PHP> = 5.3に適しています)。
class MyTestCase extends \Xpmock\TestCase { }
XPMockをプロジェクトに追加するのは非常に簡単です-composer依存関係マネージャーを使用して。 2ステップのインストール手順はこちら-github.com/ptrofimov/xpmock#installation