Je teste mes gestionnaires de commandes en quelque sorte comme ceci:Comment résoudre l'incompatibilité de InMemoryEventStore et PdoEventStore dans Prooph?
public function testHandle_ShouldPublishFooEvent(): void
{
$fooCommand = $this->givenFooCommand();
$this->whenHandleCommand($fooCommand);
$this->thenFooEventIsPublished();
}
Fondamentalement, je teste le scénario seulement heureux quand il n'y a pas de logique de validation dans le gestionnaire de commandes. Je l'ai testé en vérifiant que l'événement attendu a été publié dans le bus d'événements. Avant d'envoyer la commande tester dans le bus de commande dans la méthode whenHandleCommand, je commence l'enregistrement a envoyé des événements, quelque chose comme:
$eventBus->attach(
EventBus::EVENT_DISPATCH,
function (ActionEvent $actionEvent) use ($events): void {
$event = $actionEvent->getParam(MessageBus::EVENT_PARAM_MESSAGE);
$events->addEvent($event);
},
-1000
);
et à la fin je viens de vérifier les événements enregistrés et affirme que c'est ce que j'attendais. Mais j'ai un problème avec la commutation entre MysqlEventStore
et InMemoryEventStore
, parce que MysqlEventStore
n'est pas transactionnel (et donc émettant des événements dans la méthode saveAggregateRoot
), au lieu de InMemoryEventStore
qui est transactionnel (et donc d'émettre des événements dans la méthode commit).
Mon dépôt méthode de sauvegarde est aussi simple que:
class ProophFooRepository extends AggregateRepository implements FooRepository
{
public function save(FooAggregate $foo): void
{
$this->saveAggregateRoot($foo);
}
...
}
Comment faire pour que je puisse changer ce EventStore (mémoire ou DOP) Je veux utiliser et cela fonctionnera? Devrais-je avoir la condition if($this->isTransactionalEventStore())
(puis commencer la transaction et commettre) dans mon dépôt pour cela? Je n'aime pas ça. :(
Pourquoi il n'y a que InMemoryEventStore qui est transactionnelle devrait pas être préférable d'avoir à la fois InMemoryTransactionalEventStore
et InMemoryEventStore
Parce que je veux que mes tests obtenus avec InMemoryEventStore, alors que normalement j'utilise PdoEventStore
EDIT:?. Quand je change ligne 100 InMemoryEventStoreFactory à
$wrapper = new ActionEventEmitterEventStore($eventStore, $eventEmitter);
et faire InMemoryEventStore
outils EventStore
au lieu de TransactionalEventStore
, tout fonctionne très bien. donc, soit je suis en quelque sorte pas utilisé, ou il peut être fixé EASI correctement prooph et il n'est pas nécessaire lly par PR avec fractionnement ImMemoryEventStore
à InMemoryTransactionalEventStore
et InMemoryEventStore
?
Bien sûr, regardera cela demain :) – Tom