9

Zendの善良な人たちや多数のブロガーは、内蔵のDependency Injectionシステムではなく、ZF2の新しいサービスロケータ/マネージャを推奨しています。ZF2サービスロケータと依存性注入

私の質問は、モックオブジェクトをサービスに挿入することは可能ですか?私は、モジュールのPHPUnitブートストラップでこれを行うためのやや不器用な試みを見てきました。しかし、ZF1 + Yadifのように清潔で便利なこのサービスシステムを使用する方法はありますか?

答えて

12

はい、モックオブジェクトをサービスに挿入できます。ユニットテストでは、サービスロケータにも遊びに来ていません:あなたは依存関係とモック、あなたができるのグラフで構成するサービスロケータを使用する必要がある複雑な統合テストを記述する場合

$service = new MyService($mockDependency); 

私は私のモジュールでやっているようなセットアップ何か:あなたはこれがそれを仮定して動作しますhttps://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

DoctrineORMModuleServiceManagerFactoryの例を見つけることができます

$serviceLocator = ServiceManagerFactory::getServiceManager(); // see comment below 
$dbConnectionMock = $this->getMock('My\Db\Connection'); 

$serviceLocator->setAllowOverride(true); 
// replacing connection service with our fake one 
$serviceLocator->setService('connection_service_name', $dbConnectionMock); 

$service = $serviceLocator->get('service_that_uses_a_connection'); 

service_that_uses_a_connectionは、connection_service_nameを注入するファクトリによってインスタンス化されます。

ご希望の場合でもZend\Diを使用することはできますが、そのような場合は実際には必要ありません。

+1

ありがとうございました!うまくいけば、ある日、Zendのドキュメントがこのようになるでしょう! – AgileTillIDie

+2

@AgileTillIDie自分で投稿してください! https://github.com/zendframework/zf2-documentation - GIT-fuがない場合でも、GithubのUIでオンラインで編集できます。 – Ocramius