Lumen v5.0.10 で問題が発生しました。主に TDD とバンドルされたphpunit
拡張機能を使用してアプリケーションを設計しています。私は基本的にBindingResolutionException
「App\Contracts\SubscriberInteractionInterface」を取得しています。これは、次のように登録されているApp\Servicesに実装されているディレクトリApp\Contractsのインターフェイスです。AppServiceProvider
class AppServiceProvider extends ServiceProvider
{
public function register()
{
// Owner manager
$this->app->singleton(
'App\Contracts\OwnerInteractionInterface',
'App\Services\OwnerManager'
);
// Subscriber manager
$this->app->singleton(
'App\Contracts\SubscriberInteractionInterface',
'App\Services\SubscriberManager'
);
// dd($this->app->bound('App\Contracts\SubscriberInteractionInterface'));
}
}
私の欲求不満は、関数の最後の行のコメントを外すと、App\Contracts\SubscriberInteractionInterface
バインドされていることを示していることです (したがって、解決される可能性があります)。
次に、効果的にこのように見えるコントローラーがあります
class MyController extends Controller {
public function __construct(LoggerInterface $log)
{
$this->log = $log;
}
public function index(Request $request)
{
if (/* Seems to come from owner */)
{
$owners = App::make('App\Contracts\OwnerInteractionInterface');
return $owners->process($request);
}
if (/* Seems to come from subscriber */)
{
$subscribers = App::make('App\Contracts\SubscriberInteractionInterface');
return $subscribers->process($request);
}
}
}
このように使用するのは、関連するものだけをインスタンス化する必要があり (型ヒントを付けた場合のように両方ではなく)、それぞれのコンストラクターに型ヒント付きの依存関係があるためです。
問題は、必要なテストのルートは正常にOwnerInteractionInterface
実行されますが、必要なテストのルートは実行さSubscriberInteractionInterface
れないことです。実装とインターフェイスは大部分が似ており、前に示したように、両方が同時に登録され、SubscriberInteractionInterface
バインドされていることを確認できます。実際、次の行を入れると:
dd(App::bound('App\Contracts\SubscriberInteractionInterface'));
一番上にtrueindex()
を返します。テストはたまたま、を使用するパスが最初に実行され、それが正常に解決され、次に他のテストが. ただし、他のテストを省略してそのテストだけを実行すると、すべてがスムーズに進みます。テストは異なるファイルにあり、私が行う唯一のセットアップは、示されているものとはまったく異なるバインディングの代わりにサードパーティ API のモックをバインドすることであり、そのコードはこれらのクラスに触れていません。これは関数内で行われ、その中で呼び出すようにしています。OwnerInteractionInterface
BindingResolutionException
setUp()
parent::setUp()
何が起きてる?1 つの具象インスタンスをバインドすると、非具象バインディングが から消去されるのIoC
でしょうか? それとも、デフォルトの設定では、あるテストから別のテストに何らかの影響が移ることが許されているのでしょうか?
回避策があることはわかっていますが、完全なテストスイートを実行しないという制約は面倒です。インターフェイスからインスタンスを解決するのではなく、インスタンスを直接使用するだけで、テストが簡単になるように見え始めています。
IoC
また、解決可能なバインディングを検査する方法を知っている人はいますか?