Некоторые внимательные читатели указали на некоторые тонкие, но тем не менее важные ошибки в рамках вчерашнего фреймворка. При создании фреймворка вы должны быть уверены, что он ведет себя так как запланировано. Если же пропустить это, то все приложения основанные на нем будут содержать одни и теже баги. Хорошей новостью является то, что исправив баг в одном из них вы исправляете и в остальных.

Задача на сегодня: написать модульные тесты для нашего фреймворка используя PHPUnit. Создадим конфигурационный файл для PHPUnit example.com/phpunit.xml.dist:

Этот файл определяет настройки по умолчанию; больше всего нас интересует bootstrap показывающая наш autoloader и папку где будут хранится тесты: example.com/tests/.

Теперь давайте напишем тест для несуществующей страницы “not found”. Чтобы исключить описание всех зависимостей при написании тестов и чтобы создавать настоящие модульные тесты, мы будем использовать test doubles. Макеты проще всего создавать, когда классы полагаются на интерфейсы вместо объектов. К счастью, Symfony2 предоставляет интерфейсы для объектов ядра, таких как matcher и resolver. Изменим фреймворк, чтобы воспользоваться ими:

Теперь напишим наш первый тест:

Этот тест симулирует запрос, путя для которого не существует. Как таковой, метод match() вовзращает  ResourceNotFoundException и мы тестируем, что наш фреймворк конвертирует это исключение в ответ 404.

Запуск этого теста происходит из корневой дирректории example.com:

Я не объясняю как работает этот код, т.к. это не является целью этого цикла статей, но если вы не понимаете, что, черт возьми, происходит, я вам настоятельно рекомендую почитать документацию об PHPUnit здесь.

После прохождения теста, вы должны видеть зеленую полосу. Если же нет, то у вас есть баги или в тесте или во фреймворке!

Добавление модульного теста задача довольно тривиальная:

Последним, но не менее важным, напишим дест где мы получает корректный Response:

В этом тесте, мы симулием существующий маршрут и возврат простого контроллера. Мы проверяем, что статус ответа равен 200 и контент соотвествует нашему контроллеру.

Чтобы проверит насколько покрыт наш год тестами, запустим PHPUnit тест охвата функций (у вас должен быть установлен XDebug):

Откройте example.com/cov/src/Simplex/Framework.php.html в браузере и убедитель что все линии нашего фреймворка зеленые (это значит, что он покрыт тестами).

Благодаря простому ООП коду, который мы писали до сих пор, у нас есть возможность писать модульные тесты, чтобы покрыть все возможные ошибки нашего фреймворка; благодаря test doubles мы можем тестировать наш собственный код, вместо кода  компонентов Symfony2.

Теперь, когда мы уверены в собственном коде (опять), мы можем спокойно думать о новых фишках, которые мы добавим в наш фреймворк.