イスタンブール行きたい

たまに書きたくなります

【Laravel】テストでコンストラクタのパラメータをmockにする

以下のようなコンストラクタにパラメータのクラス(FunctionParamA)が存在するクラス(ClassX)があったとする。 パラメータのクラスを実行するメソッドのテストを書きたかったが、パラメータのクラスをmockにする方法がわからず調べたのでメモ。

class ClassX
{
    private $functionParamA;
    
    public function __construct(FunctionParamA $functionParamA)
    {
        $this->functionParamA = $functionParamA;
    }

    public function testMethod(int $id)
    {
        // 色々な処理
        call_user_func($this->functionParamA, $id);
        // 色々な処理
    }
}
class FunctionParamA
{
    public function __invoke(int $id)
    {
        // 色々な処理
    }
}

テストコードで以下のようにすればよかった

class ClassXTest extends BaseTestCase
{
    public function test_正常系()
    {
        // 略
    
        $mockFunctionParamA = Mockery::mock(FunctionParamA::class); // パラメータのクラスのMock作成
        $mockFunctionParamA->shouldReceive('__invoke'); // パラメータのクラスのメソッド設置
        $this->app->instance(FunctionParamA::class, $mockFunctionParamA); // パラメータのクラスのインスタンスをセット
        $this->app->make(ClassX::class); // そのうえでテスト対象のクラスを上書き

        $response = $this->postJson('/api/XXXXX', [
            'id' => 1
        ]);
        $response->assertStatus(200);
    }
}