Ответ 1
Вы можете unit test ваш слушатель, высмеивая все необходимые вещи, которые должны работать, например, из моего проекта:
class UploadListenerTest extends \PHPUnit_Framework_TestCase
{
public function testOnUpload()
{
$session = new Session(new MockArraySessionStorage());
$file = new File(__FILE__);
$event = new PostPersistEvent($file, new EmptyResponse, new Request(), "", []);
$listener = new UploadListener($session);
$listener->onUpload($event);
$tempFiles = $session->get('_temp_files');
$this->assertCount(1, $tempFiles);
$this->assertEquals($tempFiles[0], $file->getFilename());
$otherFile = new File(__FILE__);
$event = new PostPersistEvent($otherFile, new EmptyResponse, new Request(), "", []);
$listener->onUpload($event);
$tempFiles = $session->get('_temp_files');
$this->assertCount(2, $tempFiles);
$this->assertEquals($tempFiles[0], $file->getFilename());
$this->assertEquals($tempFiles[0], $otherFile->getFilename());
}
}
Как вы можете видеть, я создаю каждый объект, которому нужен мой приемник событий, чтобы unit test его поведение.
Вы также можете пойти функциональным способом. Загрузите ядро Symfony и создайте условия для запуска вашего события, а затем проверьте ожидаемые условия, которые необходимо выполнить после срабатывания события:
public function testUploadNoFilesNoAjaxLoggedUser()
{
$this->loginUser($this->getDummyUser());
$response = $this->requestRoute(self::UPLOAD_ROUTE, "POST");
$this->assertResponseRedirect("panel_index", $response);
}
Как вы можете видеть, я сначала регистрирую пользователя, а затем выполняю фактический запрос в форме загрузки. После этого я утверждаю, что мой ответ должен быть перенаправлением на главную панель. Symfony запускает событие под капотом, и это событие возвращает RedirectResponse, который мне нужно подтвердить.
Моя рекомендация заключается в том, что вы пытаетесь написать как единичные, так и функциональные тесты, это оставит ваше приложение в более стабильном состоянии.
ИЗМЕНИТЬ
Добавлен ответ на конкретный вопрос о том, как тестировать сам диспетчер событий в этом PR:
https://github.com/whitewhidow/AsyncDispatcherBundle/pull/1/files