【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); } }