Php 如何检查条令实体是否被持久化并刷新到数据库?
我想编写一个测试用例,通过Doctrine实体管理器验证实体是否已完全持久化到数据库 例如:Php 如何检查条令实体是否被持久化并刷新到数据库?,php,doctrine-orm,doctrine,phpunit,Php,Doctrine Orm,Doctrine,Phpunit,我想编写一个测试用例,通过Doctrine实体管理器验证实体是否已完全持久化到数据库 例如: <?php function notPersisted() { return new Entity(); } function persistedButNotFlushed() { $entity = new Entity(); $entityManager->persist($entity); return $entity; } function p
<?php
function notPersisted() {
return new Entity();
}
function persistedButNotFlushed() {
$entity = new Entity();
$entityManager->persist($entity);
return $entity;
}
function persistedAndFlushed() {
$entity = new Entity();
$entityManager->persist($entity);
$entityManager->flush();
return $entity;
}
function persistedButNotAllChangesFlushed() {
$entity = new Entity();
$entityManager->persist($entity);
$entityManager->flush();
$entity->setFoo('bar');
$entityManager->persist($entity);
return $entity;
}
$this->assertNotPersistedToDb(notPersisted());
$this->assertNotPersistedToDb(persistedButNotFlushed());
$this->assertPersistedToDb(persistedAndFlushed());
$this->assertNotPersistedToDb(persistedButNotAllChangesFlushed());
以下是我的想法:
protected function assertEntityIsPersistedToDb($entity) {
$unitOfWork = $this->entityManager->getUnitOfWork();
$isManaged = $this->entityManager->contains($entity);
$isFlushedToDb = !$unitOfWork->isEntityScheduled($entity);
$id = $this->getEntityId($entity);
$entityClassName = get_class($entity);
$msg = "Expected entity of type $entityClassName to be persisted to the database, ";
if (!$id) {
$msg .= "but the entity does not have an id.";
}
else if (!$isManaged) {
$msg .= "but entity is not managed by the entity manager.";
}
else if (!$isFlushedToDb) {
$msg .= "but the entity has changes which have not yet been flushed.";
}
$this->assertTrue(!!$id && $isManaged && $isFlushedToDb, $msg);
}
protected function assertEntityNotPersistedToDb($entity) {
// Ensure that this is a managed entity
if (!$this->entityManager->contains($entity)) {
throw new \PHPUnit_Framework_ExpectationFailedException(
"Unable to determine if entity is persisted to DB: the entity is not managed."
);
// Alternatively, we could maybe do an $em->merge($entity),
// and then check its state. However, this could change our application
// state, and potential effect test behavior.
}
$isFlushedToDb = !$this->entityManager->getUnitOfWork()
->isEntityScheduled($entity);
$entityClass = get_class($entity);
$msg = "Expected entity of type $entityClass not to be persisted to the database.";
$this->assertFalse($isFlushedToDb, $msg);
}
protected function getEntityId($entity) {
$idList = $this->entityManager
->getClassMetadata(get_class($entity))
->getIdentifier();
return empty($idList) ?
null : call_user_func([$entity, 'get' . ucfirst(reset($idList))]);
}
我对它进行了一点尝试,它似乎很有效,尽管我没有对它进行任何严格的测试。根据您的工作,如果对象中有多个关联,并且级联选项设置不正确,则分离可能是一件痛苦的事,这两个函数可以帮助您断言实体是否在应用程序状态中被管理
static function assertEntityIsManaged(EntityManager $em, $entity) {
$isManaged = $em->contains($entity);
$entityClass = get_class($entity);
$msg = "Expected entity of type $entityClass IS NOT Managed";
assert($isManaged === TRUE, $msg);
}
static function assertEntityNotManaged(EntityManager $em, $entity) {
$isManaged = $em->contains($entity);
$entityClass = get_class($entity);
$msg = "Expected entity of type $entityClass IS Managed";
assert($isManaged === FALSE, $msg);
}
静态,因为这不是一个“正式”测试,我有多个实体管理器实例。$entityManager->getUnitOfWork()->getScheduledEntityInsertions()
似乎很适合,不是吗?鉴于您实际上正试图断言工作单元
将是什么。。。看起来您正在测试D2功能。可能需要重新思考这些测试是否真的完成了任何事情。