Написать UnitTest для Symfony EventListener

У меня есть SymfonyBundle, который действительно не больше, чем пользовательский EventDispatcher и EventListener.

Как я могу проверить модульность этого кода?

Я знаю, как создавать функциональные тесты для контроллеров и т.д., но я действительно не уверен, как идти о написании тестов для этого диспетчера и слушателя.

Может кто-то указать мне в правильном направлении PLS, google, похоже, не помогает мне в этом.

Спасибо заранее.

Сэм Дж.

изменить: 04/04/2014: Это - это пакет, пытающийся создать тесты для

У меня уже есть тесты, настроенные для проверки загрузки обеих служб (диспетчера и слушателя), но теперь мне нужно проверить функцию FUNCTIONALITY. Например, проверьте, запущено ли событие, запущенное на моем диспетчере, на диспетчере REAL на ядре .terinate.

РЕДАКТИРОВАТЬ, поэтому я просто понимаю, что мне просто нужно запустить мое событие, а затем каким-то образом перейти к kernel.terminate и проверить, было ли мое событие затем запущено реальным диспетчером, но как..

Ответы

Ответ 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