यहां मेरी स्थिति है। मैं एक ज़ेंड फ्रेमवर्क 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
।
कोई भी विचार इस मुद्दे को हल करने के लिए कैसे करें?
आखिरकार मैंने थोड़ा अलग दृष्टिकोण उपयोग किया है (लेकिन मुख्य विचार वही है, मैंने बस मेरे अंदर और तर्क डाला Phpunit के लिए Bootstrap.php)। लेकिन आपका काम भी करता है। –
मेरा भी बहुत कुछ करता है, इसे मूलभूत आवश्यकताओं को कम करता है –
हाय एंड्रियास। मैं ZF2 + Doctrine2 का भी उपयोग कर रहा हूं और आपकी विधि का पालन कर रहा हूं। जबकि ServiceLocator सेट किया गया है, ऐसा लगता है कि ईवेंट नियंत्रक प्लगइन्स के लिए प्रचारित नहीं है - उदाहरण के लिए राउटर सेवा लोकेटर में सेट है लेकिन रीडायरेक्ट() प्लगइन में नहीं है। इसे कैसे सेट करें इस पर कोई विचार? – Ross