こんなとき
class Hoge { public function fuga() { return app('some_class')->someMethod(); } }
class SomeClassProvider extends ServiceProvider { public function register() { $this->app->singleton('some_class', function () { return new SomeClass(); }); } }
appでインスタンス呼ばれてるうううう
テスト書くときどうしよう?
使うもの
$this->app->instance(Hoge::class, $mock);
テストコード
public function testFuga() { $mock = Mockery::mock('SomeClass'); $mock->shouldReceive('someMethod') ->once() ->andReturn('hoge'); $this->app->instance('some_class',$mock); $this->assertSame($this->hoge->fuga(), 'hoge'); }
何をしているのか
appの結合を新しく宣言しました。
通常時は、SomeClassProviderで'some_class'に対してsingleton結合されていました。
使われるクラスは、 singletonで作られた、SomeClassのインスタンスです。
これに対してテストコード内では、'some_class'に対して、$mockのインスタンスを返す、instance結合を宣言しました。
なので、テスト実行時にapp('some_class')をすると、$mockのインスタンスが返されます。
これによって、$mockによる関数実行が行えます!