Я хочу проверить консольную команду 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());
}
}
Единственной проблемой, которую я не мог решить, было вернуть выходные данные команды в мойкод.Более того, это как-то запускает некоторый код фреймворка / контейнера дважды (один раз при загрузке ядра внутри тестов, один раз при выполнении команды).