2012-03-18 41 views
4

我目前正在嘗試使用phpUnit來測試我的doctrine2.2對象,以便使用可以找到的原則擴展hereDoctrine2.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. 

回答

4

我有同樣的問題和解決方案是分享測試之間的實體管理器:

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; 
} 
0

除了什麼@Zedenek Machek說: 但從Ioo的點sely連接測試,共享燈具應避免

它不能強調不夠,測試間共享fixture降低測試的價值。潛在的設計問題是對象不是鬆散耦合的。除了在運行時創建測試之間的依賴關係並且忽略改進設計的機會之外,您將獲得解決底層設計問題的更好結果,然後使用存根編寫測試(請參閱第9章)。

請參閱https://phpunit.de/manual/current/en/fixtures.html#fixtures.sharing-fixture.examples.DatabaseTest.php