Вопрос по symfony, php – Запуск консольной команды из тестового примера Symfony 2

23

Есть ли способ запустить консольную команду из тестового примера Symfony 2? Я хочу запустить команды доктрины для создания и удаления схем.

Ваш Ответ

4   ответа
72

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

right way выполнения консоли в Symfony2, как показано ниже:

Option one
use Symfony\Bundle\FrameworkBundle\Console\Application as App;
use Symfony\Component\Console\Tester\CommandTester;

class YourTest extends WebTestCase
{
    public function setUp()
    {
        $kernel = $this->createKernel();
        $kernel->boot();

        $application = new App($kernel);
        $application->add(new YourCommand());

        $command = $application->find('your:command:name');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array('command' => $command->getName()));
    }
}
Option two
use Symfony\Component\Console\Input\StringInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;

class YourClass extends WebTestCase
{
    protected static $application;

    public function setUp()
    {
        self::runCommand('your:command:name');
        // you can also specify an environment:
        // self::runCommand('your:command:name --env=test');
    }

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

P.S. Guys, don't shame Symfony2 with calling exec()...

Опять же, вопрос был не о тестировании команд ...
Ссылка @FrancescoCasula не работает - новое местоположение:symfony.com/doc/current/console.html#testing-commands
Это правильный ответ, как упомянуто в официальной документации Symfony2 в разделе «Команды тестирования»:symfony.com/doc/current/components/console/…
-1

Да, если ваша структура каталогов выглядит

/symfony
    /app
    /src

тогда ты побежал бы

phpunit -c app/phpunit.xml.dist

из ваших модульных тестов вы можете запускать команды PHP либо с помощью

passthru("php app/console [...]") (http://php.net/manual/en/function.passthru.php)
exec("php app/console [...]") (http://www.php.net/manual/en/function.exec.php)

или положив команду в тики назад

php app/consode [...]

Если вы запускаете модульные тесты из каталога, отличного от symofny, вам придется настроить относительный путь к каталогу приложения, чтобы он работал.

Чтобы запустить его из приложения:

// the document root should be the web folder
$root = $_SERVER['DOCUMENT_ROOT'];

passthru("php $root/../app/console [...]");
Разве нет способа запуска изнутри приложения? Я пытаюсь создать полностью изолированные тесты. vinnylinux
я не уверен, как получить доступ к среде из приложения, но если есть способ, которым вы можете это сделать, просто поместите промежуточный элемент внутри оператора if, который проверяет среду
exec () не будет работать, так как он не будет находиться в тестовом контейнере.
Да, вы можете поместить этот код в модель или сущность, но вам придется использовать$_SERVER['DOCUMENT_ROOT']; чтобы получить путь к приложению. Я отредактирую свой ответ
Кроме того, я хочу, чтобы команда выполнялась в определенной среде (тест). vinnylinux
5

документы скажу вам предложенный способ сделать это. Пример кода вставлен ниже:

 OutputInterface $output)
{
    $command = $this->getApplication()->find('demo:greet');

    $arguments = array(
        'command' => 'demo:greet',
        'name'    => 'Fabien',
        '--yell'  => true,
    );

    $input = new ArrayInput($arguments);
    $returnCode = $command->run($input, $output);

    // ...
}
Я уже ссылался на эту главу, на самом деле :)
Ой, не заметил этого.
Это для запуска команды из другой команды, а не из контрольного примера.
-3

чтобы отразить правильный способ вызова существующей команды в Symfony 2:

http://symfony.com/doc/current/components/console/introduction.html#calling-an-existing-command

Работал как шарм, спасибо. vinnylinux
Это даже не хороший способ, так как вы не можете правильно проанализировать выход. Вы также можете столкнуться с проблемами со средой (что, если php не находится на пути пользователя, выполняющего тесты?).
Обратите внимание, что первоначальный вопрос касается не команд тестирования, а выполнения команд во время тестов. Как удаление / воссоздание данных, проверка пользователей без проверки электронной почты и т. Д. Пожалуйста, внимательно прочитайте, прежде чем переходить на более раннюю версию.
Пожалуйста, не делайте так!
Это не верный путь Symfony

Похожие вопросы