【发布时间】:2012-09-08 01:33:46
【问题描述】:
这是我的情况。我正在开发 Zend Framework 2 应用程序。我正在使用 Doctrine 模块与 MySQL 数据库进行通信。它在应用程序中运行良好,我可以从控制器内的服务定位器加载实体管理器。
但在我的控制器单元测试中,服务定位器不存在,因此所有处理数据库的测试都失败,并显示如下错误消息:
致命错误:在第 19 行的 /Users/richardknop/Projects/myproject/module/Api/src/Api/Controller/UserController.php 中的非对象上调用成员函数
get()
我已将问题缩小到这种方法:
$this->getServiceLocator()
在我的控制器中有效,但在单元测试中返回 NULL。
这是我的 application.config.php:
<?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 文件:
<?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');
我的控制器测试的 setUp 方法如下所示:
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);
}
一个示例控制器单元测试如下所示:
public function testGetListHttpStatusCode()
{
$response = $this->_controller->dispatch($this->_request);
$this->assertEquals(405, $response->getStatusCode());
}
所有未连接到数据库的测试都通过了。我使用实体管理器的测试失败,但出现此错误:
致命错误:在第 19 行的 /Users/richardknop/Projects/myproject/module/Api/src/Api/Controller/UserController.php 中的非对象上调用成员函数
get()
这是第 19 行:
$this->_em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
它失败的原因是$this->getServiceLocator()返回NULL。
任何想法如何解决这个问题?
【问题讨论】:
标签: php doctrine-orm phpunit zend-framework2