События функционального тестирования и подписчики в Symfony 4 - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно функционально протестировать подписчика в Symfony 4, и у меня возникают проблемы с поиском как. Подписчик имеет следующую структуру:

/**
* Class ItemSubscriber
*/
class ItemSubscriber implements EventSubscriberInterface
{
    /**
     * @var CommandBus
     */
    protected $commandBus;

    /**
     * Subscriber constructor.
     *
     * @param CommandBus $commandBus
     */
    public function __construct(CommandBus $commandBus)
    {
        $this->commandBus = $commandBus;
    }

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return [
            CommandFailedEvent::NAME => 'onCommandFailedEvent',
        ];
    }

    /**
     * @param CommandFailedEvent $event
     *
     * @throws Exception
     */
    public function onCommandFailedEvent(CommandFailedEvent $event)
    {
        $item = $event->getItem();
        $this->processFailed($item);
    }

    /**
     * Sends message 
     *
     * @param array $item
     *
     * @throws Exception
     */
    private function processFailed(array $item)
    {
        $this->commandBus->handle(new UpdateCommand($item));
    }
}

Поток подписчика получает внутреннее событие и отправляет сообщение кроликом через командную шину в другой проект.

Как это проверить? отправка события CommandFailedEvent выполняется строка в processFailed(array $item)?

Есть ли у кого-нибудь документация по передовым методам тестирования событий и подписчиков в Symfony 4?

1 Ответ

1 голос
/ 05 марта 2020

Если вы хотите проверить процесс вызова обработчика командной шины, вы можете проверить вызовы методов зависимости благодаря mock ожидает . У вас есть несколько примеров в документации PHPUnit .

Например, у вас будет что-то вроде:

$commandBus = $this->getMockBuilder(CommandBus::class)->disableOriginalConstructor()->getMock();
$commandBus->expects($this->once())->method('handle');

// Create your System Under Test
$SUT = new CommandFailedSubscriber($commandBus);

// Create event
$item = $this->getMockBuilder(YourItem::class)->getMock();
$event = new CommandFailedEvent($item);

// Dispatch your event
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber($SUT);
$dispatcher->dispatch($event);

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

Приятного времяпровождения!

...