2017-11-21 24 views
1

シナリオ

現在開発段階にあるAPIをテストするための単体テストを作成しています。実際のオブジェクトの呼び出しの代わりに実行されるモックの配列を含むモックコンテナクラス(デコレータパターン)があります。

これらのモックコンテナは、テスト実行中にDIコンテナに配置され、モデル/コントローラの代わりにコンテナを呼び出します。ほとんどの場合、コントローラの機能は許可されますが、時にはそれらを嘲笑したいことがあります。モックコンテナは、__callを介してアクセスできない関数呼び出しをキャッチし、割り当てられたモックデータを返すか、または内部オブジェクトに当たることによって動作します。

問題

これは、の使用の場合に正常に動作します:c['Controller_Name']として

$this->c['Controller_Name']->functionHere()

は、私たちのモックコンテナのインスタンスですが、このアプローチの問題は、それ自体を参照するコントローラから来ていますfunctionHereを嘲笑しなければならないときには$this->functionHere()経由であるが、私たちのモックコンテナではなくコントローラのインスタンスである$thisでコールが発生する。

クラス自身のメンバーへの呼び出しをインターセプトするためのもっともらしい方法がありますので、私は$this->functionHere()をキャッチし、詳細を話すことが、あなたのセットアップは、そのハード知らず$this->c['Controller_Name']->functionHere()

答えて

1

に適切に変換することはできますが、依存性注入を使用しているとして、テストから除外するすべての実装をインターフェースすることは、たとえば別のTestDIModuleを使用してマップされた模擬バージョンを作成できることを意味します。そうすれば、何かを傍受する必要はありません。

オブジェクト内の関数呼び出しをキャッチすることについては、これを行う必要がある場合、クラスが複数の「単位」の作業を実行していることを示している可能性がありますので、別のクラスにリファクタリングしてインターフェイスすることをお勧めします。上記のようにこれらをインターフェイスに抽出することで、これらを偽装して個別にテストすることができます。