使用kernel.terminate事件的测试控制台命令(KernelTestCase)

时间:2018-12-30 10:03:37

标签: symfony symfony4

我想测试一个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

我无法解决的唯一问题是将命令的输出返回到我的代码中。而且,这种方式确实会运行两次框架/容器代码(一次是在测试中引导内核时执行,一次是在执行命令时运行)。

1 个答案:

答案 0 :(得分:0)

我仔细检查过,看来您正在测试控制台,而不是内核。他们是2个不同的班级。

尝试将console terminate event添加到订户-console.terminate

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

    public function someFunction()
    {
    }
}