Symfony2: функциональное тестирование не работает во время загрузки Fixtures

Я работаю над функциональным тестированием пакета, и у меня возникли некоторые проблемы. Это содержимое LoadFeeData.php:

public function load(ObjectManager $manager) {
    for ($i = 0; $i < 10; $i++) {
        $fee = new Fee();
        $fee->setName("Comision-" . uniqid());
        $fee->setDescription($this->generateRandomString());
        $fee->setHoldback(1);
        $manager->persist($fee);
        $manager->flush();
    }
}

И это то, что я делаю в своем тесте:

public function setUp() {
    static::$kernel = static::createKernel();
    static::$kernel->boot();
    $this->em = static::$kernel->getContainer()->get('doctrine')->getManager();

    $loader = new Loader();
    $loader->addFixture(new LoadFeeData());

    $purger = new ORMPurger();
    $executor = new ORMExecutor($this->em, $purger);
    $executor->execute($loader->getFixtures());
}

Но каждый раз, когда я пытаюсь выполнить команду:

 phpunit -c app/ src/Company/ApprovalBundle/Tests/Controller/CommissionCompanyControllerTest.php

Я получаю эту ошибку:

1) Company\ApprovalBundle\Tests\Controller\CommissionCompanyControllerTest::testmodifyCommissionAction Doctrine\DBAL\DBALException: при выполнении «УДАЛИТЬ ИЗ ext_translations» возникло исключение:

SQLSTATE [42S02]: базовая таблица или представление не найдено: 1146 Таблица «kraken.ext_translations» не существует

Где ошибка?


person ReynierPM    schedule 22.03.2014    source источник
comment
Вы запускали команду app/console: схема: обновление -- принудительно?   -  person Tomáš Tibenský    schedule 23.03.2014


Ответы (1)


Благодаря предложениям @tomas-tibensky я внес некоторые изменения в свой код, и теперь фикстуры загружаются так, как я хочу (сейчас мне нужно узнать, как удалить их после тестовых прогонов), но в любом случае вот решение, так как БД не обновляется тогда вам нужно запустить команду doctrine:schema:update --force для обновления схемы БД, а затем загрузить фикстуры:

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase,
    Doctrine\Common\DataFixtures\Loader,
    Doctrine\Common\DataFixtures\Executor\ORMExecutor,
    Doctrine\Common\DataFixtures\Purger\ORMPurger,
    Symfony\Bundle\FrameworkBundle\Console\Application,
    Symfony\Component\Console\Input\StringInput
    Company\ApprovalBundle\Entity\CompanyHasWtax,
    Company\RegisterCompanyBundle\Entity\Company,
    Company\ApprovalBundle\DataFixtures\ORM\LoadFeeData;

class CommissionCompanyControllerTest extends WebTestCase {

    private $em;
    protected static $application;

    public function setUp() {
        static::$kernel = static::createKernel();
        static::$kernel->boot();
        $this->em = static::$kernel->getContainer()->get('doctrine')->getManager();

        self::runCommand('doctrine:schema:update --force');

        $loader = new Loader();
        $loader->addFixture(new LoadFeeData());

        $purger = new ORMPurger();
        $executor = new ORMExecutor($this->em, $purger);
        $executor->execute($loader->getFixtures());
    }

    protected static function runCommand($command) {
        $command = sprintf('%s --quiet', $command);

        return self::getApplication()->run(new StringInput($command));
    }

    protected static function getApplication() {
        if (null === self::$application) {
            $client = static::createClient();

            self::$application = new Application($client->getKernel());
            self::$application->setAutoExit(false);
        }

        return self::$application;
    }
}
person ReynierPM    schedule 23.03.2014