Mockery のモック、パーシャル、スパイの違いを覚えるのにうんざりしていませんか?私はそのため、Mockery を簡単に使用できるようにするためのシンプルなヘルパー メソッドであるdouble()
を作成しました。
テストを書くとき、フェイク、モック、スパイの違いについては考えたくありません。汎用テストのダブルを作成し、テストの作成に集中するだけです。この一般化は、RSpec、td.js などの他のテスト フレームワークでも一般的です。
最新バージョンのdouble()
ヘルパーをインストールするには、次のコマンドを実行します。
composer require --dev jasonmccreary/test-double
テストダブルを作成する必要があるときはいつでも、 double()
を呼び出すだけです。
デフォルトでは、 double()
メソッドのスタブ化とメソッド呼び出しの検証を可能にするオブジェクトを返します。
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
Mockery では、このテスト ダブルはMockery::mock()->shouldIgnoreMissing()
、または最近のバージョンではMockery::spy()
と同等です。
double()
クラスまたはインターフェイスへの参照を渡すこともできます。これにより、クラスを拡張するかインターフェイスを実装するテスト オブジェクトが作成されます。これにより、double は実装内で型ヒントや型チェックを渡すことができます。
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
最後に、 double()
passthruの 2 番目の引数を受け入れます。デフォルトでは、パススルーはfalse
です。 true
に設定すると、テスト オブジェクトはすべてのメソッド呼び出しを基になるオブジェクトに渡します。
Mockery では、これはMockery::mock(Number::class)->shouldDeferMissing()
と同等です。
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
注:パススルーは、基になる実装が存在する唯一の場合であるため、クラス参照を使用してテスト ダブルを作成する場合にのみ使用できます。
結局のところ、 double()
基礎となるコードのテスト オブジェクトを作成する独自の方法です。ニーズを満たさない場合は、いつでもMockery::mock()
直接作成できます。ただし、そうすることは、現実世界の動作を反映しない方法で実装をテストしている可能性があります。 double()
MockeryInterface
実装するオブジェクトを返すことに注意してください。したがって、他のMockery::mock()
オブジェクトとして扱うことができます。