/** * Get new model instance via service manager * * This method allows temporarily overriding services with manually supplied * instances. This is useful for injecting mock objects which will be passed * to the model's constructor by a factory. A clone of the service manager is * used to avoid interference with other tests. * * @param array $overrideServices Optional associative array (name => instance) with services to override * @return object Model instance */ protected function _getModel(array $overrideServices = array()) { if (empty($overrideServices)) { $serviceManager = static::$serviceManager; } else { // Create temporary service manager with identical configuration. $config = static::$serviceManager->get('config'); $serviceManager = new \Zend\ServiceManager\ServiceManager($config['service_manager']); // Clone 'config' service $serviceManager->setService('config', $config); // If not explicitly overridden, copy database services to avoid // expensive reconnect or table setup which has already been done. if (!isset($overrideServices['Db'])) { $serviceManager->setService('Db', static::$serviceManager->get('Db')); } if (!isset($overrideServices['Database\\Nada'])) { $serviceManager->setService('Database\\Nada', static::$serviceManager->get('Database\\Nada')); } // Override specified services foreach ($overrideServices as $name => $service) { $serviceManager->setService($name, $service); } } // Always build a new instance. return $serviceManager->build($this->_getClass()); }