Fernando Mandon
Fernando Mandon
Laravel
Comparte:

Testear controlador que usa interfaz en servicio.

Hola buenas tardes, ¿Cómo puedo testear el controlador usando el patrón repositorio sabiendo que la interfaz y el repositorio están inyectadas en el app service provider?
Me arroja el siguiente error:
Mockery\Exception\BadMethodCallException: Received Mockery_1_App_Http_Controllers_API_GatewayController::myPayments(), but no expectations were specified
Tengo el proyecto estructurado así:
1. En service provider:
$this->app->bind('App\Http\Interfaces\GatewayInterface', 'App\Http\Services\GatewayService');

2. Inyecto la interfaz en el constructor del controlador para llamarla en el método
    public function myPayments(App\Http\Requests\MyPaymentsFormRequest $request)
    {
        return $this->interface->myPayments($request);
    }

3. Y luego la interface llama el metodo del servicio:
    public function myPayments(App\Http\Requests\MyPaymentsFormRequest $request)
    {
        // ...
        return Resource($collection);
    }

4. El test lo tengo así:
    public function setUp(): void
    {
        parent::setUp();
        $this->interface = Mockery::mock(GatewayInterface::class);
        $this->controller = Mockery::mock(GatewayController::class);
    }

    public function testMyPayments()
    {
        $request = Mockery::mock(MyPaymentsFormRequest::class);

        $this->interface->shouldReceive('myPayments')->with($request)->once()->andReturnSelf();

        $this->controller->myPayments($request);
    }

Le agradezco su colaboración para saber que me falta para que funcione. Gracias