Юнит-тестирование процесса Symfony 4.2 выполняется бесконечно l oop (чем истекло время ожидания), без юнит-теста он работает нормально - PullRequest
1 голос
/ 15 марта 2020

Допустим, у меня есть следующая команда Symfony 4:

class Command1  extends Command {
    protected static $defaultName = 'app:command1';

    protected function execute(InputInterface $input, OutputInterface $output){
        $process = new Process('bin/console list', getcwd());
        $process->start(); // or even $process->run() does not matter if its async or not
        // ... where we handle if its finished, etc...
    }
}

Если я просто позвоню bin/console app:command1, она вернет ожидаемый список команд. В основном работает, как я и ожидал.

Но если у меня есть тест phpunit, использующий Symfony\Component\Console\Application::run() для запуска этой команды, я получаю "бесконечное l oop" (ну, на самом деле нет, это раз после 60 se c) в Symfony\Component\Process::wait() в

do {
    $this->checkTimeout();
    $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
    $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
} while ($running);

, где $this->processPipes->areOpen() всегда будет открыт.

Мне кажется, если я использую любой Symfony консольная команда в процессе через phpunit, всегда будет открыто два канала, например:

1 = {resource} resource id='x' type='stream'
2 = {resource} resource id='z' type='stream'

, но я не знаю, что это на самом деле. Я также видел в htop, что proc_open start () фактически запускает новый процесс, но он просто зависает (абсолютно ничего не делает, даже не может его отладить) до истечения времени ожидания. Ничего в журналах ошибок (кроме таймаута).

...