2012-09-14 7 views
9

यहां मेरी स्थिति है। मैं एक ज़ेंड फ्रेमवर्क 2 एप्लिकेशन विकसित कर रहा हूं। मैं एक MySQL डेटाबेस के साथ संवाद करने के लिए सिद्धांत मॉड्यूल का उपयोग कर रहा हूँ। यह एप्लिकेशन में ठीक काम कर रहा है, मैं अपने नियंत्रकों के अंदर सेवा लोकेटर से इकाई प्रबंधक लोड कर सकता हूं।ज़ेंड फ्रेमवर्क 2 सिद्धांत 2 मॉड्यूल - नियंत्रक यूनिट टेस्ट में कोई सेवा लोकेटर

लेकिन मेरे नियंत्रक इकाई परीक्षण, सेवा लोकेटर नहीं मौजूद है करता है और वजह डेटाबेस के साथ काम कर सभी परीक्षणों इस तरह त्रुटि संदेश के साथ असफल रहे हैं अंदर:

Fatal error: Call to a member function get() on a non-object in /Users/richardknop/Projects/myproject/module/Api/src/Api/Controller/UserController.php on line 19

मैं इस विधि के लिए नीचे समस्या संकुचित है :

$this->getServiceLocator() 

जो मेरे नियंत्रकों में काम करता है लेकिन यूनिट परीक्षणों में शून्य देता है।

<?php 

return array(
    'modules' => array(
     'DoctrineModule', 
     'DoctrineORMModule', 
     'Api', 
    ), 
    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 
     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 

डेटाबेस कनेक्शन विवरण के साथ मेरे local.php फ़ाइल:

यह मेरा application.config.php है

<?php 

return array(
    'doctrine' => array(
     'connection' => array(
      'orm_default' => array(
       'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 
       'params' => array(
        'host'  => 'localhost', 
        'port'  => '3306', 
        'user'  => 'root', 
        'password' => 'root', 
        'dbname' => 'mydb', 
       ), 
      ), 
     ), 
    ), 
); 

मेरी module.config.php में मेरे पास है:

'doctrine' => array(
    'driver' => array(
     __NAMESPACE__ . '_driver' => array(
      'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
      'cache' => 'array', 
      'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity') 
     ), 
     'orm_default' => array(
      'drivers' => array(
       __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
      ), 
     ), 
    ), 
), 

और मेरे नियंत्रकों में मैं इकाई प्रबंधक पाने के लिए इस विधि का उपयोग:

private $_em; 

private function _getEntityManager() 
{ 
    if (null === $this->_em) { 
     $this->_em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 
    } 
    return $this->_em; 
} 
अब

मेरी इकाई परीक्षण।

<?php 

chdir(dirname(__DIR__)); 
include __DIR__ . '/../init_autoloader.php'; 
return Zend\Mvc\Application::init(include 'config/application.config.php'); 

और मेरे नियंत्रक परीक्षण की स्थापना विधि लगता है:

public function testGetListHttpStatusCode() 
{ 
    $response = $this->_controller->dispatch($this->_request); 
    $this->assertEquals(405, $response->getStatusCode()); 
} 

सभी परीक्षण कर रहे हैं:

public function setUp() 
{ 
    $this->_controller = new UserTokenController; 
    $this->_request = new Request; 
    $this->_routeMatch = new RouteMatch(array('controller' => 'user')); 
    $this->_event = new MvcEvent(); 
    $this->_event->setRouteMatch($this->_routeMatch); 
    $this->_controller->setEvent($this->_event); 
} 

एक उदाहरण नियंत्रक इकाई परीक्षण तो की तरह दिखता है यहाँ बूटस्ट्रैप फ़ाइल है डेटाबेस से कनेक्ट नहीं हो रहा है। टेस्ट जहाँ मैं इकाई प्रबंधक का उपयोग कर रहा है, हालांकि इस त्रुटि के साथ विफल हो रहे हैं:

Fatal error: Call to a member function get() on a non-object in /Users/richardknop/Projects/myproject/module/Api/src/Api/Controller/UserController.php on line 19

इस लाइन 19 है:

$this->_em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 

और कारण वह असफल रहा है कि $this->getServiceLocator() रिटर्न NULL

कोई भी विचार इस मुद्दे को हल करने के लिए कैसे करें?

उत्तर

6

न 'इस इस तरह से अपनी bootstrap.php

return Zend\Mvc\Application::init(include 'config/application.config.php');` in your 

लेकिन कुछ भारतीय नौसेना पोत कार्य करें:

chdir('/path/to/application/root'); 

// if you're using composer to install zf2 
include_once 'vendor/autoload.php'; 
// if not using composer initialize your custom autoloading here 

$configuration = include('config/application.config.php'); 
$serviceManager = new ServiceManager(new ServiceManagerConfig(
    isset($configuration['service_manager']) ? $configuration['service_manager'] : array() 
)); 
$serviceManager->setService('ApplicationConfig', $configuration); 
$serviceManager->setFactory('ServiceListener', 'Zend\Mvc\Service\ServiceListenerFactory'); 

$moduleManager = $serviceManager->get('ModuleManager'); 
$moduleManager->loadModules(); 
$serviceManager->setAllowOverride(true); 

$application = $serviceManager->get('Application'); 
$event = new MvcEvent(); 
$event->setTarget($application); 
$event->setApplication($application) 
    ->setRequest($application->getRequest()) 
    ->setResponse($application->getResponse()) 
    ->setRouter($serviceManager->get('Router')); 

आप तो अपने परीक्षण मामले में स्थिर तरीकों की स्थापना की और घटना प्राप्त करने के लिए बना सकते हैं। ..

namespace My; 

class TestCase extends \Some\Basic\TestCase 
{ 
    protected static $_mvcEvent; 

    public static function setMvcEvent(MvcEvent $e) { 

     self::$_mvcEvent = $e; 
    } 

    public static function getMvcEvent() { 

     return self::$_mvcEvent; 
    } 
} 

... और bootstrap.php फ़ाइल

My\TestCase::setMvcEvent($event); 

से और परीक्षण के अपने स्थापना विधि में यह इंजेक्षन बस इस

$this->_controller = new UserTokenController; 
$this->_controller->setEvent(self::getMvcEvent()); 
$this->_controller->setServiceLocator(
    self::getMvcEvent()->getApplication()->getServiceManager() 
); 

की तरह कुछ भी अनुरोध आदि इंजेक्षन करना घटना से-> यहां नियंत्रक में आवेदन ...

+0

आखिरकार मैंने थोड़ा अलग दृष्टिकोण उपयोग किया है (लेकिन मुख्य विचार वही है, मैंने बस मेरे अंदर और तर्क डाला Phpunit के लिए Bootstrap.php)। लेकिन आपका काम भी करता है। –

+0

मेरा भी बहुत कुछ करता है, इसे मूलभूत आवश्यकताओं को कम करता है –

+0

हाय एंड्रियास। मैं ZF2 + Doctrine2 का भी उपयोग कर रहा हूं और आपकी विधि का पालन कर रहा हूं। जबकि ServiceLocator सेट किया गया है, ऐसा लगता है कि ईवेंट नियंत्रक प्लगइन्स के लिए प्रचारित नहीं है - उदाहरण के लिए राउटर सेवा लोकेटर में सेट है लेकिन रीडायरेक्ट() प्लगइन में नहीं है। इसे कैसे सेट करें इस पर कोई विचार? – Ross

0

बस अपने नियंत्रक कोसे बढ़ाएं\ Zend \ Test \ PHPUnit \ Controller \ AbstractHttpControllerTestCase

यह सेवा सेवा लोकेटर है और अन्य कई नियंत्रक की नौकरी करता है। साथ ही उपलब्ध नियंत्रक आवेषण, प्रतिक्रिया asserts, सीएसएस asserts आदि बनें उदाहरण के साथ विवरण यहां देखें http://framework.zend.com/manual/2.1/en/modules/zend.test.phpunit.html

संबंधित मुद्दे