難しいようで、これに関するドキュメントはあまりありません (私は FirendsOfBehat Symfony 拡張機能を使用しています)。Transport
メソッドを使用してイベントを実行するかどうかをテストしたいのget()
ですが、結果が得られません。正しいバスをルーティングしていないように感じます。
declare(strict_types=1);
namespace App\Features\BehatContext;
class MessengerContext implements Context
{
/**
* @var TransportInterface
*/
private $transport;
/**
* MessengerContext constructor.
*
* @param TransportInterface $transport ??? Is this ok
*/
public function __construct(TransportInterface $transport)
{
// Symfony\Component\Messenger\Transport\InMemoryTransport
$this->transport = $transport;
}
/**
* THIS IS WHAT DOESN'T WORK
* @Given /^(\d+) Events? "([^"]*)" is dispatched$/
*/
public function eventAEventIsDispatched()
{
$eventsDispatched = $this->transport->get();
Assert::assertTrue(count($eventsDispatched));
}
}
私のpackages/messenger.yaml
構成:
framework:
messenger:
default_bus: event.bus
buses:
command.bus:
middleware:
- validation
event.bus:
default_middleware: allow_no_handlers
transports:
sync: 'sync://'
event: 'in-memory:///'
routing:
'App\AddMagazine': sync
'App\MagazineAdded': event
'App\EventAdapter': event
これは私のイベントをディスパッチするクラスです
declare(strict_types=1);
namespace App\Event\Dispatcher;
class SymfonyEventDispatcher implements ApplicationDomainDispatcherInterface
{
private $messageBus;
/**
* SymfonyEventDispatcher constructor.
*
* @param MessageBusInterface $sfDispatcher
*/
public function __construct(MessageBusInterface $eventBus)
{
// messageBus is Symfony\Component\Messenger\TraceableMessageBus
$this->messageBus = $eventBus;
}
/**
* @param EventInterface $event
*
* @return EventInterface
*/
public function dispatch(EventInterface $event): EventInterface
{
$eventAdapter = new EventAdapter($event);
$this->messageBus->dispatch(new Envelope($eventAdapter));
return $eventAdapter;
}
}
これは、Behat テストを実行するときに考慮される私の service_test.yaml ファイルです。
services:
_defaults:
autowire: true
autoconfigure: true
App\Features\BehatContext\:
resource: '../features/BehatContext/*'
App\Features\BehatContext\MessengerContext:
arguments:
$transport: '@messenger.transport.event'
ログを確認すると、メッセンジャーがイベントを送信したことがわかります。
[2019-08-30 14:14:50] messenger.INFO: メッセージ App\EventAdapter を Symfony\Component\Messenger\Transport\InMemoryTransport {"メッセージ":"[オブジェクト] (App\EventAdapter: {})" で送信しています。 "class":"App\EventAdapter","sender":"Symfony\Component\Messenger\Transport\InMemoryTransport"} []