Doctrine2.2 (sqlite используя память) используя OrmTestCase с phpUnit TroubleShoot - PullRequest
4 голосов
/ 18 марта 2012

В настоящее время я пытаюсь проверить мои объекты doctrine2.2 с помощью phpUnit. Я использую расширения доктрины, которые можно найти здесь .

Это базовый класс, который все моиphpUnit TestClass extension.

<?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 в памяти, только первая функция test получает данные из метода getDataSet () (когда я запускаю это, используя базу данных sqlite, все в порядке).* Почему метод getDataSet () работает только для первого метода тестирования?

Вот результат запуска теста в командной строке:

C: \ TestSuite\ phpUnit \ testsuites> phpUnit --configuration al

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.

Ответы [ 2 ]

4 голосов
/ 07 октября 2013

У меня была та же проблема, и решение было разделить менеджер сущностей между тестами:

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 голосов
/ 03 июля 2015

В дополнение к тому, что @Zedenek Machek сказал: с точки зрения слабой связи вашего теста, следует избегать совместного использования приборов :

Нельзя подчеркнуть, что совместное использование приборов между тестами снижает ценность тестов. Основная проблема проектирования заключается в том, что объекты не связаны слабо. Вы достигнете лучших результатов, решив основную проблему проектирования и затем написав тесты с использованием заглушек (см. Главу 9), чем создавая зависимости между тестами во время выполнения и игнорируя возможность улучшить свой дизайн.

см. https://phpunit.de/manual/current/en/fixtures.html#fixtures.sharing-fixture.examples.DatabaseTest.php

...