エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】app()を使った関数をテストする時にoverload使わない方が良いって話【495日目】

こんなコードがありました

public function XXX() {
    return app('key_class')->make();
}

テストコードが2種類

$mock = Mockery::mock('XxxService')->makePartial();

$this->app->instance('key_class', $mock)
$mock = Mockery::mock('overload:XxxService')->makePartial();

何してるの?

前者は、'key_class'に設定していた結合を、instance結合で新しく上書きしている。

後者は、該当クラスが生成された時に、$mockに入れ替える。

どう違うの?

public function XXX() {
    $obj = new XxxService();
    $value = app('key_class');
}

仮にこんな関数があったときに、

前者は$objはXxxServiceのオブジェクト、$valueは、$mockになります。
一方後者は、両方共$mockになります。

そんなパターンある?

例えば、これでXxxServiceのオブジェクトだったからいいですが、
これがEloquentのモデルクラスだったら?

どこか予想外で生成されそうな気がしませんか・・・?

基本、overloadを使おうと思ったら、踏みとどまる方がいいかもしれないです。
それ、本当にoverloadでやるべき・・・?