Zend の善良な人々と多くのブロガーは、組み込みの依存性注入システムではなく、ZF2 の新しいサービス ロケーター/マネージャーを推奨しています。
私の質問は、モックオブジェクトをサービスに挿入することは可能ですか/便利ですか? モジュールの PHPUnit ブートストラップでこれを行うための少し不器用な試みを見てきました。しかし、例えばZF1+Yadifのようにクリーンで便利なこのサービスシステムを使用する方法はありますか?
Zend の善良な人々と多くのブロガーは、組み込みの依存性注入システムではなく、ZF2 の新しいサービス ロケーター/マネージャーを推奨しています。
私の質問は、モックオブジェクトをサービスに挿入することは可能ですか/便利ですか? モジュールの PHPUnit ブートストラップでこれを行うための少し不器用な試みを見てきました。しかし、例えばZF1+Yadifのようにクリーンで便利なこのサービスシステムを使用する方法はありますか?
はい、モック オブジェクトをサービスに挿入できます。単体テストの場合、サービス ロケータは機能しません。
$service = new MyService($mockDependency);
Service Locator を使用して依存関係とモックのグラフを構成する必要がある複雑な統合テストを作成している場合は、私がモジュールで行っているようにセットアップできます。
$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');
https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.phpServiceManagerFactory
で例を見つけることができDoctrineORMModule
ます
service_that_uses_a_connection
これは、注入するファクトリによってインスタンス化されていると仮定して機能しますconnection_service_name
。
必要に応じて引き続き使用することもできZend\Di
ますが、そのような場合は実際には必要ありません。