Doctrine2.2(sqlite使用内存)使用OrmTestCase与phpUnit TroubleShoot
问题描述:
我目前正在尝试使用phpUnit来测试我的doctrine2.2对象,以便使用可以找到的原则扩展here。Doctrine2.2(sqlite使用内存)使用OrmTestCase与phpUnit TroubleShoot
这是我所有的phpUnit TestClass扩展的基类。
<?php
use DoctrineExtensions\PHPUnit\Event\EntityManagerEventArgs,
DoctrineExtensions\PHPUnit\OrmTestCase,
Doctrine\ORM\Tools\SchemaTool,
Doctrine\Common\EventManager,
Doctrine\ORM\Tools\Setup,
Doctrine\ORM\EntityManager;
class SchemaSetupListener {
public function preTestSetUp(EntityManagerEventArgs $eventArgs) {
$em = $eventArgs->getEntityManager();
$schemaTool = new SchemaTool($em);
$cmf = $em->getMetadataFactory();
$classes = $cmf->getAllMetadata();
$schemaTool->dropDatabase();
$schemaTool->createSchema($classes);
}
}
class EntityFunctionalTest extends OrmTestCase {
protected function createEntityManager() {
$config = Setup::createXMLMetadataConfiguration(array(DIR_XML_SCHEMA), true); // dev mode true
$conn = array('driver' => 'pdo_sqlite', 'path' => DIR_TEST_SUITE_ROOT . 'test.db');
$conn = array('driver' => 'pdo_sqlite', 'memory' => true);
$eventManager = new EventManager();
$eventManager->addEventListener(array("preTestSetUp"), new SchemaSetupListener());
return Doctrine\ORM\EntityManager::create($conn, $config, $eventManager);
}
protected function getDataSet() {
return $this->createFlatXmlDataSet(DIR_XML_TEST_DATA . 'db.boot.strap.test.flat.xml');
}
protected function tearDown(){
$entityManager = $this->getEntityManager();
$entityManager->flush();
$entityManager->getConnection()->getConfiguration()->setSQLLogger(null);;
$entityManager->close();
}
public function getSystemUser(){
return $this->getEntityManager()->createQuery('select u from User u where u.id = 1')->getSingleResult();
}
}
?>
当我在下面注释掉以下内容时,以便sqlite不会在内存中创建其数据库,但一切正常,但速度很慢。
$conn = array('driver' => 'pdo_sqlite', 'path' => DIR_TEST_SUITE_ROOT . 'test.db');
//$conn = array('driver' => 'pdo_sqlite', 'memory' => true);
当我取消对该行并尝试运行在内存使用slqlite数据库的测试中,只有第一个测试功能从getDataSet获取数据()方法(当我运行这个使用SQLite数据库一切都很好) 。
为什么只有第一个测试方法的getDataSet()方法才起作用?
这里是运行在命令行测试箱的输出:
C:\的TestSuite \ PHPUnit的\测试包> PHPUnit的--configuration人
lTests.xml
PHPUnit 3.6.10 by Sebastian Bergmann.
Configuration read from C:\TestSuite\phpUnit\testsuites\al
lTests.xml
.E
Time: 1 second, Memory: 16.00Mb
There was 1 error:
1) UserTest::testId
Doctrine\ORM\NoResultException: No result was found for query although at least
one row was expected.
C:\Program Files (x86)\PHP\PEAR\Doctrine\ORM\AbstractQuery.php:491
C:\TestSuite\phpUnit\testsuites\classes\entities\EntityFun
ctionalTest.php:43
C:\TestSuite\phpUnit\testsuites\classes\entities\UserTest.
php:60
C:\Program Files (x86)\PHP\phpunit:46
FAILURES!
Tests: 2, Assertions: 8, Errors: 1.
答
我有同样的问题和解决方案是分享测试之间的实体管理器:
protected static $em = null;
public static function setUpBeforeClass()
{
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/../src"), $isDevMode, null, null, false);
$connectionOptions = array('driver' => 'pdo_sqlite', 'memory' => true);
// obtaining the entity manager
self::$em = EntityManager::create($connectionOptions, $config);
$schemaTool = new SchemaTool(self::$em);
$cmf = self::$em->getMetadataFactory();
$classes = $cmf->getAllMetadata();
$schemaTool->dropDatabase();
$schemaTool->createSchema($classes);
}
public static function tearDownAfterClass()
{
self::$em = NULL;
}
protected function createEntityManager()
{
return self::$em;
}
答
除了什么@Zedenek Machek说: 但从Ioo的点sely连接测试,共享灯具应避免:
它不能强调不够,测试间共享fixture降低测试的价值。潜在的设计问题是对象不是松散耦合的。除了在运行时创建测试之间的依赖关系并且忽略改进设计的机会之外,您将获得解决底层设计问题的更好结果,然后使用存根编写测试(请参阅第9章)。