Symfony 3.4 — в пространстве имен «doctrine:schema» не определены команды при попытке запустить консольную команду в классе

Я слежу за этим блогом, чтобы создавать модульные тесты, использующие мои приборы данных в качестве базы. Соответствующий код:

namespace Tests\AppBundle\Repository;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class DataFixtureTestCase extends WebTestCase
{
    protected $client, $container, $em;
    protected static $application;

    /**
     * {@inheritdoc}
     */
    protected function setUp()
    {
        self::runCommand('doctrine:schema:drop --force');
        self::runCommand('doctrine:schema:create');
        self::runCommand('doctrine:fixtures:load --append --no-interaction --force');

        $this->client = static::createClient();
        $this->container = $this->client->getContainer();
        $this->em = $this->container->get('doctrine')->getManager();
    }

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

        try {
            return self::getApplication()->run(new StringInput($command));
        } catch(\Exception $e) {
            echo $e->getMessage();
        }
    }

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

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

        return self::$application;
    }

    // other methods not relevant to the question

Мои классы модульных тестов расширяют DataFixtureTestCase. Когда вызывается setUp(), я продолжаю получать такие ошибки, как:

В пространстве имен «doctrine:schema» не определены команды.

Любые идеи о том, что вызывает это? Мои исследования не выявили причину ошибки. Doctrine правильно устанавливается через Composer, и я могу запускать консольные команды вручную в терминале.


person Major Productions    schedule 21.02.2018    source источник
comment
Я думаю, тогда проблема может быть в рабочем каталоге здесь. Вы видите вывод этих команд? Можете ли вы распечатать текущий рабочий каталог в своем PHP-коде и посмотреть, не так ли это должно быть при запуске из терминала. Также вам не хватает parent::setUp();, я полагаю, вам не следует этого делать   -  person Tarun Lalwani    schedule 23.02.2018


Ответы (3)


Ваша проблема в том, что вы используете для этого неправильный класс Application.

Посмотрите на свой php-файл bin/console. ссылка на github

Сдача:

use Symfony\Component\Console\Application;

to

use Symfony\Bundle\FrameworkBundle\Console\Application;
person Jannes Botis    schedule 23.02.2018

doctrine/doctrine-bundle и doctrine/doctrine-fixtures-bundle должны быть установлены для запуска команд doctrine:schema и doctrine:fixtures

person Denis Alimov    schedule 23.02.2018
comment
Я бы не пытался запускать эти консольные команды, если бы я еще не установил эти пакеты через Composer: P - person Major Productions; 23.02.2018

Как предложил Денис, попробуйте добавить пакеты Doctrine через componser:

composer require doctrine/doctrine-bundle
composer require doctrine/doctrine-fixtures-bundle --dev
person Tomas Votruba    schedule 23.02.2018