Юнит-тест Symfony MessengerPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Юнит-тест Symfony Messenger

Сообщение Anonymous »

Я возился с реализацией AMQP с помощью Symfony Messenger в своем последнем проекте. Хотя код работает, к моей огромной радости, я не могу писать модульные тесты для методов, отправляющих сообщения.

Все мои тесты, включающие код, отправляющий сообщения, приводят к следующим предупреждениям:

Class "Symfony\Component\Messenger\Envelope" is declared "final" and cannot be mocked.


Мне не удалось найти на сайте Symfony документацию по тестам Symfony Messenger.

Как я могу протестировать свой код с помощью модульных тестов, включающих сообщения?

Класс:

namespace App\MessageHandler;

use App\Entity\File;
use App\Message\CheckVideoMessage;
use App\Message\GenerateThumbnailMessage;
use App\Message\GetVideoMetadataMessage;
use App\Message\ProcessFileMessage;
use App\Service\MediaProcessorService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Messenger\MessageBusInterface;

class ProcessFileMessageHandler
{
/**
* @var MediaProcessorService
*/
private $mediaProcessorService;

/**
* @var EntityManagerInterface
*/
private $entityManager;

/**
* @var LoggerInterface
*/
private $logger;

/**
* @var MessageBusInterface
*/
private $messageBus;

public function __construct(
MediaProcessorService $mediaProcessorService,
EntityManagerInterface $entityManager,
LoggerInterface $logger,
MessageBusInterface $messageBus
) {
$this->mediaProcessorService = $mediaProcessorService;
$this->entityManager = $entityManager;
$this->logger = $logger;
$this->messageBus = $messageBus;
}

public function __invoke(ProcessFileMessage $message)
{
/** @var File $file */
$file = $this->entityManager->find(File::class, $message->getFileId());

if (!$file->getInode()->getMeta()) {
$this->messageBus->dispatch(new GetVideoMetadataMessage($file->getId()));
}

// This event will also dispatch message to generate thumbnails if the video is valid
$this->messageBus->dispatch(new CheckVideoMessage($file->getId()));

$this->messageBus->dispatch(new GenerateThumbnailMessage($file->getId()));
}
}


Тестовый файл:

namespace App\Tests\MessageHandler;

use App\Entity\Inode;
use App\MessageHandler\ProcessFileMessageHandler;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use App\Entity\File;
use App\Message\CheckVideoMessage;
use App\Message\GenerateThumbnailMessage;
use App\Message\GetVideoMetadataMessage;
use App\Message\ProcessFileMessage;
use App\Service\MediaProcessorService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Messenger\MessageBusInterface;

class ProcessFileMessageHandlerTest extends TestCase
{
/**
* @var MediaProcessorService|MockObject
*/
private $mediaProcessorService;

/**
* @var EntityManagerInterface|MockObject
*/
private $entityManager;

/**
* @var LoggerInterface|MockObject
*/
private $logger;

/**
* @var MessageBusInterface|MockObject
*/
private $messageBus;

/**
* @var ProcessFileMessageHandler
*/
private $handler;

protected function setUp()
{
$this->mediaProcessorService = $this->getMockBuilder(MediaProcessorService::class)
->disableOriginalConstructor()
->getMock();

$this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)
->disableOriginalConstructor()
->getMock();

$this->logger = $this->getMockBuilder(LoggerInterface::class)
->disableOriginalConstructor()
->getMock();

$this->messageBus = $this->getMockBuilder(MessageBusInterface::class)
->disableOriginalConstructor()
->getMock();

$this->handler = new ProcessFileMessageHandler(
$this->mediaProcessorService,
$this->entityManager,
$this->logger,
$this->messageBus
);
}

/**
* @test
*/
public function willDispatchAllMessagesOnANewFile()
{
$message = new ProcessFileMessage(1);
$inode = (new Inode())->setMeta(false);
$file = (new File())->setId(1)->setInode($inode);

$this->entityManager->expects($this->once())
->method('find')
->willReturn($file);

$this->messageBus->expects(self::exactly(3))
->method('dispatch')
->withConsecutive(
self::isInstanceOf(GetVideoMetadataMessage::class),
self::isInstanceOf(CheckVideoMessage::class),
self::isInstanceOf(GenerateThumbnailMessage::class)
);

$handler = $this->handler;
$handler($message);
}
}


Подробнее здесь: https://stackoverflow.com/questions/541 ... -messenger
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Codeception: приемочный тест выполняется как первый тест в группе тестов, где тест API определяется как первый тест в гр
    Anonymous » » в форуме Php
    0 Ответы
    96 Просмотры
    Последнее сообщение Anonymous
  • Юнит-тест для скрипта Python3 с использованием unittest
    Anonymous » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Юнит-тест Hangfire с NSubstitute
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Symfony Messenger — Как убить работающего работника?
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Symfony Messenger — Как убить работающего работника?
    Anonymous » » в форуме Php
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Php»