尝试对我的服务模型进行单元测试,这些模型充满了针对我的已处理实体的Doctrine的flush命令。我收到的错误是我的新模拟对象没有持久化,并且关系没有新实体的级联选项。
看到这个后,我意识到我也不希望我的flush()操作转到数据库,因为它们只是对新实体的单元测试。
如何让Doctrine忽略模拟对象并忽略刷新操作?
现在我收到此错误:Fatal error: Command failed: PHP Fatal error: Call to a member function bindValue() on a non-object in /Users/person/Sites/project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php on line 1311
:
// Nullify EM
$sm->setAllowOverride(true);
$sm->setFactory('Doctrine\ORM\EntityManager', function ($sm) {
$eventManager = null;
$metadataCache = new \Doctrine\Common\Cache\ArrayCache;
$paths = $sm->get('Config')['doctrine']['driver']['application_entities']['paths'];
$config = new \Doctrine\ORM\Configuration();
$config->setMetadataCacheImpl($metadataCache);
$config->setMetadataDriverImpl($config->newDefaultAnnotationDriver($paths, false));
$config->setQueryCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Doctrine\Tests\Proxies');
$conn = array(
'driverClass' => 'Doctrine\Tests\Mocks\DriverMock',
'wrapperClass' => 'Doctrine\Tests\Mocks\ConnectionMock',
'user' => 'john',
'password' => 'wayne'
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, $eventManager);
return \Doctrine\Tests\Mocks\EntityManagerMock::create($conn, $config, $eventManager);
});
我可以通过改变Doctrine的测试代码来解决上述问题,但这是不允许的。 我已经尝试创建一个EntityManager模拟器来存储我的ServiceManager中的模拟刷新,但EntityManager是一个单例,所以无论如何返回一个新的实例。关于使用Doctrine的服务的单元测试绝对没有信息,所以在这一点上我只能假设它实际上不可能。
答案 0 :(得分:0)
好的,谷歌搜索了好几天之后。我终于收到了Ocramius关于如何实际测试Doctrine消费服务的答案:https://gist.github.com/Ocramius/3994325