我想测试一个symfony 4控制台命令。
重要的是,我想在所有ViewGroup var1
事件监听器完成之后测试情况。为了在这里演示,我有一个最简单的侦听器,该侦听器var_dumps一个字符串:
kernel.terminate
因此,启用此事件侦听器后,对任何命令(或http路由)的任何调用都会输出此字符串。
根据the docs,我创建了一个测试用例:
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;
}
}
但是断言失败。有趣的是,在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
事件监听器?好的,在Tomas Votruba的帮助下,我找到了(部分)解决方案:
KernelTestCase
我无法解决的唯一问题是将命令的输出返回到我的代码中。而且,这种方式确实会运行两次框架/容器代码(一次是在测试中引导内核时执行,一次是在执行命令时运行)。
答案 0 :(得分:0)
我仔细检查过,看来您正在测试控制台,而不是内核。他们是2个不同的班级。
内核终止事件is invoked here。
控制台应用程序“终止”事件is invoked here。
尝试将console terminate event添加到订户-console.terminate
。
class YourSubscriber implements EventSubccriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::TERMINATE => 'someFunction',
ConsoleEvents::TERMINATE => 'someFunction',
];
}
public function someFunction()
{
}
}