2

テストを書いている新しいモジュールがあります。このモジュールには、DI コンテナーを使用して他のオブジェクトを作成する必要があるため、ServiceLocatorAwareInterface を実装するクラスが含まれています。スケルトン アプリで実行するとすべて正常に動作しますが、モジュール テストを実行すると、次の結果が得られます。

Zend\Di\Exception\RuntimeException: "Zend\ServiceManager\ServiceLocatorInterface" の "NULL" 型のインスタンス化子が無効です

少し調べてみると、DI コンテナーが「ServiceLocatorAwareInterface」タイプの新しいオブジェクトを作成しようとしていることがわかりましたが、これはもちろん間違っています。

テストのブートストラップをもう少し掘り下げると、次の行を追加すると問題が解決することがわかりました。これは、DI がそのインターフェイスに対してインスタンス化するクラスを認識しているためです。

$di->instanceManager()->addTypePreference('Zend\ServiceManager\ServiceLocatorInterface', new \Zend\ServiceManager\ServiceManager());

私が渡した ServiceManager はダミーであるため、これが問題の最善の解決策であるかどうかはわかりません。

他のアイデアはありますか?

4

2 に答える 2

2

はい、あなたは正しい方向に進んでいます。(環境設定のドキュメントを参照してください)

最近、ServiceManager を支持して DI を使用している人は多くありません (私自身も含めて) が、DI の構成が ZF2 ベータ版と同様である場合は、DI 構成に「設定」セクションを追加できるはずです。そのようです:

'di' => array(
    'instance' => array(
        'preferences' => array(
            'My_Interface' => 'My_Implementation_Or_Alias',
        ) 
    )
)

この構成ブロックは、への呼び出しを置き換えることができます$di->instanceManager()->addTypePreference()


現在のドキュメントを調べて、ここの例を模倣すると、ZF2 公式リリースを使用して、以下に示すように DI 構成を定義することに成功する場合があります。

$di = new Zend\Di\Di;
$di->configure(new Zend\Di\Config(array(
    'instance' => array(
        'preferences' => array(
            'My_Interface' => 'My_Implementation_Or_Alias',
        ) 
    )
)));
于 2012-09-17T20:37:01.577 に答える
1

この場合にできることは次のとおりです。

モジュール単体テストのブートストラップで、テストしているモジュールのみをロードする構成で構成されたダミー アプリケーションを作成します。

...//other code before this for autoloading stuff

// DON'T RUN THE application in your tests, just init it
$application = Zend\Mvc\Application::init(include 'config/test.application.config.for.module.php');

$fullyConfigedManager = $application->getServiceManager();

TestCases::setServiceManager( $fullyConfigedManager );

アプリケーションがブーストラップされた後、ServiceManager をアプリケーションから直接プルできます。このサービス マネージャーは、モジュールのファクトリ、呼び出し可能オブジェクト、および構成を使用して完全に構成する必要があります。

于 2012-09-14T19:24:00.763 に答える