0

場合によっては、ServiceManagerからフルクラス名でインスタンスを取得しています。次に例を示します。

$someThing = $serviceManager->get('MyModule\Some\Nice\Lib\SomeThing');

これはHTTPMVCリクエストに対してはかなりうまく機能しますが、phpunitを使用している場合、ServiceManagerはそれを見つけることができません。(「 ...のインスタンスをフェッチまたは作成できませんでしたZend\ServiceManager\Exception\ServiceNotFoundException」というメッセージとともに例外をスローします)Zend\ServiceManager\ServiceManager::get

ドキュメントのデフォルトのテストブートストラップの例を使用していますが、異なるmashineの2つの異なるプロジェクトでこの問題が発生しているため、これは一般的な問題だと思います。

私の最初の推測は、MVCまたはアプリケーションと関係があるということでした。これは、テストとhttpの唯一の本当の違いである可能性が高いためです。私は両方のモードでSMインスタンスをダンプし、それらを相互に比較し、ソースを調べてWebを検索しました。

残念ながら、労働契約のため、コードを貼り付けることができません。ただし、先ほど申し上げましたように、これは一般的な問題なので、簡単に再現できるはずです。

この問題の原因とその解決方法を知っている人はいますか?

4

2 に答える 2

0

モジュールをテスト構成に追加したことを確認してください。

return array(
    'modules' => array(
        'MyModule',
        //...
    ),
    //...
);

そうしないと、ModuleManagerはそれをロードしようとしないため、モジュールオートローダーは登録されません。

于 2013-01-04T08:05:22.223 に答える
0

私はなんとか問題を見つけることができました。

を使用して完全なクラス名でインスタンスを作成するとServiceManager、実際にはデフォルトでインスタンスを作成できなくなります。ただし、可能であれば、それに接続されている抽象ファクトリにタスクを委任します。

これで、DiFactoryを使用してDiインスタンスを作成すると、ファクトリはaDiAbstractServiceFactoryをSMに登録します。そして、ご想像のとおり、この抽象ファクトリは、完全なクラス名でクラスをインスタンス化できます。

私はDiこのプロジェクトでめったに使用しませんでした(私はそれをあまり快適に感じず、最初は間違って使用したためです。今はよく知っています)。そのため、インスタンス化する唯一のポイントはモジュールDiのメソッド内です。onBootstrap()これはMVCコンテキストでは問題onBootstrap()ありませんが、HTTP MVCイベントハンドラーと同様に、テストアプリケーションでは呼び出されません。したがって、noDiはいつでもインスタンス化されないためServiceManagerDiAbstractServiceFactoryアタッチされていないため、呼び出しを委任できずget()、フルクラス名でクラスをインスタンス化できません。

それはそれと同じくらい簡単です!:-)

明らかな解決策:Diテストアプリケーション内にインスタンスを作成します。

于 2013-01-07T11:14:37.440 に答える