2017-10-09 9 views
0

私はまだLaravelとDependency Injectionについて学んでいます。私は、概念を理解し、私は、この特定のケースでは、依存関係を模擬する方法がわからない:Laravelカスタムパッケージをモック依存関係でテストする

MyController.php

use Illuminate\Routing\Controller;  
use MyPackage\Services\ServiceInterface; 

class MyController extends Controller{ 
    protected $service; 

    public function __construct(ServiceInterface $service) 
    { 
     $this->service = $service; 
    }  
} 

MyServiceProvider.php

use Illuminate\Support\ServiceProvider; 

class MyServiceProvider extends ServiceProvider{ 

    public function register() 
    { 
     $this->app->bind('MyPackage\Services\ServiceInterface', function ($app) { 
      return new MyPackage\Services\ConcreteService(['key'=>'123'], $app->make('GuzzleHttp\Client')); 
     }); 
    }  
} 

ので、あなたが見ることができるように、私はServiceInterfaceのインスタンスを必要とするコントローラを持っています。そのインスタンスはServiceProviderで解決されています。 ConcreteServiceのコンストラクタでは、APIへのHTTPリクエストを実行するためにクライアントが必要です。このHttpはServiceコンテナによって解決されています(これはGuzzleのインスタンスになります)。

ここで、私のテストでGuzzleのこのインスタンスを模擬する方法はありますか?

MyTest.php

... 
$this->post(route('routeToActionInMyController'), $params); 

だから、私のテストでは、私はちょうどMyControllerの具体的な方法を使用するルートをヒットする必要があり

理想的な結果は、このような何かをやっています.phpしかし、私は "本当の" Guzzleインスタンスは必要ありません。 MyControllerが期待どおりに動作しているかどうかをテストするためのレスポンスを模擬し、データベースに適切なものを格納するだけです。

テスト中にMockedオブジェクトを挿入するようにサービスコンテナに指示するにはどうすればよいですか?それとも私はまったく間違った方法でこれをやっていますか?

ご協力いただければ幸いです。あなたのテストクラスで事前

+0

'class MyServiceProvider extends Controller'は非常に悪い習慣のようです。コントローラーとサービスプロバイダーは、全く別のものに責任を負うことを意図しています。 – apokryfos

+0

ああ、大変申し訳ありません、それはタイプミスでした –

答えて

0

ありがとう:

class TestingSomething extends TestCase { 
    protected function setUp() { 
      parent::setUp(); 
      $mockServiceInterface = $this->getMockBuilder(ServiceInterface::class)->getMock(); 
      $this->app->instance(ServiceInterface::class,$mockServiceInterface); 
    } 

    public function testPostToRoute() { 
     $this->post(route('routeToActionInMyController'), $params); 
    } 
} 

は、これはすでにモックインスタンスを持つサービスコンテナにバインドされているものに置き換える必要があります。

モックビルダーと結果として得られるモックについては、PHPUnit manual on chapter 9. Test doublesを参照してください。

+0

あなたの返事@apokryfosに感謝します。つまり、バインディング全体を置き換える必要がありますか?つまり、私はGuzzleバインディングだけを置き換えることはできません。 –

+0

依存関係注入によってguzzleをインスタンス化すると、guzzleクライアントをモックできます。それもうまくいくはずです – apokryfos

+0

私はGuzzleがこれを箱の外に持っていると思います。 http://docs.guzzlephp.org/ja/stable/testing.html – apokryfos

関連する問題