doctrine&# 39;的实体管理器崩溃并保持关闭状态


Doctrine's entity manager crashes and stays down

因此,当我在ZF/Doctrine应用程序上运行测试时,一些测试碰巧破坏了Doctrine实体管理器,并且由于EM被关闭,所有顺序测试都失败了。

我在我的tests/bootstrap.php中设置了EM:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
(...)
$bootstrap = $application->getBootstrap();
$em = $bootstrap->getResource('doctrinemanager');

然后我在test setUp()函数中设置它($this->_service是正在测试的服务):

$em = App::getEntityManager();
$this->_em = clone $em;
$this->_service->setEm($this->_em);

然后,当我运行一个导致EM抛出异常并关闭的测试时(这对我来说是正确的行为),它在所有测试中保持关闭,当然,由于EM关闭而失败。这不是我期望的测试行为,你可以猜到。

在服务中设置EM之前,我尝试了克隆EM,但是没有成功。

是否有一个简单的方法来重新打开EM也许使用一些学说的方法?

不知道,至少我不知道。解决这个问题的最简单方法是简单地(重新)引导应用程序在每个测试的设置阶段运行。因此,每个测试都会获得一个新的$application实例和一个新的$em。这是一个快速解决方案。

正确的解决方案可能是将测试与Zend_Application解耦。允许您的测试使用简单的实体管理器运行,可能使用模拟连接或连接到内存中的SQLite数据库。在测试设置阶段只创建这个实体管理器,这样每个测试都会得到一个新的实体管理器。这与上面的快速修复类似,只不过现在您只需要为测试专门创建一个实体管理器,而不是为每个测试引导整个应用程序。