私はまだ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オブジェクトを挿入するようにサービスコンテナに指示するにはどうすればよいですか?それとも私はまったく間違った方法でこれをやっていますか?
ご協力いただければ幸いです。あなたのテストクラスで事前
'class MyServiceProvider extends Controller'は非常に悪い習慣のようです。コントローラーとサービスプロバイダーは、全く別のものに責任を負うことを意図しています。 – apokryfos
ああ、大変申し訳ありません、それはタイプミスでした –