https://github.com/mockery/mockery
Mockery::mock()によるオブジェクト生成の考え方で、aliasとかoverloadとかプロキシとか、よくわからなかったのでメモ。ツッコミ募集!
#「クラス名」
- 定義済みクラスの拡張として生成
- 静的メソッドはいじれない
- shouldDeferMissing()すると、既存メソッドを呼べる
-
m::mock('User')->shouldDeferMissing()
とm::mock('User')->makePartial()
とm::mock(new User)
は同じような挙動(つまり既存メソッドを呼べる)。
class User{
function fuga(){
return 'hoge';
}
static function fuga(){
return 'fuga';
}
function foo(){
return 'foo';
}
}
$obj = m::mock('User')->shouldDeferMissing();
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');
$obj->hoge(); //mocked_hoge
Staff::fuga(); //fuga
$obj->foo(); //foo
#「alias:クラス名」
- 未定義のクラスならなんでも、stdClassの拡張として生成(→つまりshouldDeferMissingはできない)
- 追加したメソッドは、静的にも動的にも呼べる
- 以後 new すると、空のmockが生成される
$obj = m::mock('alias:Bar');
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');
$obj->hoge(); //mocked_hoge
Bar::hoge(); //mocked_hoge
Bar::fuga(); //mocked_fuga
$obj = new Bar;
$obj->hoge(); //error method not exists
$obj->foo(); //error method not exists
#「overload:クラス名」
- 未定義のクラスならなんでも、stdClassの拡張として生成(→つまりshouldDeferMissingはできない)
- 追加したメソッドは、静的にも動的にも呼べる
- 以後 new すると、メソッド追加済みのモックが生成される
$obj = m::mock('overload:Bar');
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');
$obj->hoge(); //mocked_hoge
Bar::hoge(); //mocked_hoge
Bar::fuga(); //mocked_fuga
$obj = new Bar;
$obj->hoge(); //mocked_hoge
$obj->fuga(); //mocked_fuga