web-dev-qa-db-ja.com

PHPUnitのモックとスタブ

私はスタブが状態を確認し、モックが動作を確認することを知っています。

PHPUnitでモックを作成してメソッドの動作を確認するにはどうすればよいですか? Phpunitには検証メソッド(verify())がありません。モックを作成する方法はわかりませんPHPUnitです。

ドキュメントでは、スタブを作成することはよく説明されています:

// Create a stub for the SomeClass class.
$stub = $this->createMock(SomeClass::class);

// Configure the stub.
$stub
    ->method('doSomething')
    ->willReturn('foo');

// Calling $stub->doSomething() will now return 'foo'.
$this->assertEquals('foo', $stub->doSomething());

しかし、この場合は、返答を返すと言って、ステータスを確認しています。

モックを作成して動作を確認する例はどのようになりますか?

16
RodriKing

PHPUnitは、テストdoubleを作成する2つの方法をサポートしています。レガシーPHPUnitモックフレームワークの隣に、そのままの状態で予言をサポートするようになりました。

PHPUnitモッキングフレームワーク

createMockメソッドは、3つの主に既知のテストdoubleを作成するために使用されます。オブジェクトを構成して、ダミー、スタブ、またはモックにします。

モックビルダーでテストスタブを作成することもできます(getMockBuilderはモックビルダーを返します)。これは、流暢なインターフェイスを使用していくつかの追加のモックオプションを微調整できるようにする同じ方法のもう1つの方法です(詳細は ドキュメント を参照)。

ダミー

ダミーは渡されますが、実際には呼び出されないか、呼び出された場合、デフォルトの応答(主にnull)で応答します。主に、引数のリストを満たすために存在します。

$dummy = $this->createMock(SomeClass::class);

// SUT - System Under Test
$sut->action($dummy);

スタブ

スタブは、クエリのようなメソッド(物を返すメソッド)で使用されますが、実際に呼び出されるかどうかは重要ではありません。

$stub = $this->createMock(SomeClass::class);
$stub->method('getSomething')
    ->willReturn('foo');

$sut->action($stub);

モック

モックはコマンドのようなメソッドで使用されます-それらが呼び出されることが重要であり、それらの戻り値についてはあまり気にしません(コマンドメソッドは通常値を返しません)。

$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
    ->method('doSomething')
    ->with('bar');

$sut->action($mock);

テストメソッドの実行が終了すると、期待値が自動的に検証されます。上記の例では、メソッドdoSomethingSomeClassで呼び出されなかった場合、または構成した引数とは異なる引数で呼び出された場合、テストは失敗します。

スパイ

サポートされていません。

預言

ProphecyはそのままPHPUnitでサポートされるようになったため、レガシーモックフレームワークの代替として使用できます。繰り返しますが、これはオブジェクトを構成する方法であり、オブジェクトを特定のタイプのテストdoubleにします。

ダミー

$dummy = $this->prophesize(SomeClass::class);

$sut->action($dummy->reveal());

スタブ

$stub = $this->prophesize(SomeClass::class);
$stub->getSomething()->willReturn('foo');

$sut->action($stub->reveal());

モック

$mock = $this->prophesize(SomeClass::class);
$mock->doSomething('bar')->shouldBeCalled();

$sut->action($mock->reveal());

スパイ

$spy = $this->prophesize(SomeClass::class);

// execute the action on system under test
$sut->action($spy->reveal());

// verify expectations after 
$spy->doSomething('bar')->shouldHaveBeenCalled();
48
Jakub Zalas