Консольная команда тестирования, использующая событие kernel.terminate (KernelTestCase) - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу проверить консольную команду symfony 4.Важно отметить, что я хочу проверить ситуацию после того, как все kernel.terminate обработчики событий закончили.Чтобы продемонстрировать здесь, у меня есть самый простой слушатель, который var_dumps строка:

class NotificationCenter implements EventSubscriberInterface
{
    public function onException()
    {
        $this->wasExceptionThrown = true;
    }

    public function onTerminate()
    {
        if ($this->wasExceptionThrown) {
            return;
        }
        var_dump("Hiho from terminate");
    }
    public static function getSubscribedEvents()
    {
        $listeners = [
            KernelEvents::EXCEPTION => ['onException', 1024],
            KernelEvents::TERMINATE => ['onTerminate', 1024],
        ];
        if (class_exists('Symfony\Component\Console\ConsoleEvents')) {
            $listeners[class_exists('Symfony\Component\Console\Event\ConsoleErrorEvent') ? ConsoleEvents::ERROR : ConsoleEvents::EXCEPTION] = ['onException', 1024];
            $listeners[ConsoleEvents::TERMINATE] = ['onTerminate', 1024];
        }
        return $listeners;
    }
    public function reset()
    {
        $this->wasExceptionThrown = false;
    }
}

Таким образом, с включенным этим обработчиком событий любой вызов любой команды (или http-маршрута) выводит эту строку.

Согласно документам , я создал контрольный пример:

class MissingDataNotifyCommandTest extends KernelTestCase
{
    protected function setUp()
    {
        self::bootKernel();
    }

    public function testHiHoIsThere()
    {
        $application = new Application(static::$kernel);
        $command = $application->find('debug:event-dispatcher');
        $commandTester = new CommandTester($command);
        $commandTester->execute(['command'  => $command->getName()]);
        $this->assertContains('Hiho from terminate', $commandTester->getDisplay());
    }
}

Но утверждение не выполнено .Забавно, но команда отладки, в которой var_dumps указана в kernel.terminate.

Как я могу убедиться, что диспетчеры событий kernel.terminate отправляются во время KernelTestCase?

Редактировать: мое решение

Хорошо, с помощью Томаса Вотрубы я смог найти (частичное) решение:

class MissingDataNotifyCommandTest extends KernelTestCase
{
    protected function setUp()
    {
        self::bootKernel();
    }

    public function testHiHoIsThere()
    {
        $application = new Application(static::$kernel);
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);
        $stringInput = ['debug:event-dispatcher'];
        $input = new StringInput(implode(' ', $stringInput));
        $application->run($input, new NullOutput());
    }
}

Единственной проблемой, которую я не мог решить, было вернуть выходные данные команды в мойкод.Более того, это как-то запускает некоторый код фреймворка / контейнера дважды (один раз при загрузке ядра внутри тестов, один раз при выполнении команды).

1 Ответ

0 голосов
/ 30 декабря 2018

Я дважды проверил, и похоже, что вы тестируете консоль, а не ядро.Они 2 разных класса.

Попробуйте добавить событие завершения консоли для подписчика - console.terminate.

class YourSubscriber implements EventSubccriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::TERMINATE => 'someFunction',
            ConsoleEvents::TERMINATE => 'someFunction',
        ];
    }

    public function someFunction()
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...