À propos de ce tutoriel
Les EventSubscriber
ne sont pas forcément des classes complexes à tester. Ils agissent comme de simples services en ayant comme particularité de définir les événements auxquels ils souscrivent.
L’objectif des tests sera donc de vérifier que la classe s'abonne aux bons évènements et appelle les méthodes dans l'ordre attendu.
On peut commencer par simplement vérifier que notre évènement figure dans le tableau de souscription.
public function testEventSubscription () {
$this->assertArrayHasKey(ExceptionEvent::class, ExceptionSubscriber::getSubscribedEvents());
}
Mais une approche plus solide consistera à utiliser le dispatcher pour vérifier que l'évènement est convenablement capturé et traité.
Pour tester le code suivant par exemple :
// On mock les services dont dépend la classe
$mailer = $this->getMockBuilder(\Swift_Mailer::class)->disableOriginalConstructor()->getMock();
$mailer->expects($this->once())->method('send');
// On crée notre subscriber
$subscriber = new ExceptionSubscriber($mailer);
// On crée notre évènement
$kernel = $this->getMockBuilder(KernelInterface::class)->getMock();
$event = new ExceptionEvent($kernel, new Request(), 1, new \Exception('Hello world'));
// On dispatch notre évènement en ayant notre subscriber dans le dispatcher.
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber($subscriber);
$dispatcher->dispatch($event);
Pour le reste (la logique métier de votre subscriber), le test s'écrira comme n'importe quelle classe PHP.