Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Тестирование отдельных Symfony 2 бандлов

Anna | 29.05.2014 | нет комментариев

Начну с коротенькой предыстории. Была у меня задача написать резерватор для номеров в гостинице, я полез на всеми нами любимый packagist, в поисках готового решения и, к моему глубокому разочарованию, не обнаружил ничего. Ну, нужно сделать — сделаем. Код написан, покрыт функциональными тестами в приложении. Через пару недель я решил выложить написанный бандл на github. Но передо мною встал вопрос: при тестировании отдельного бандла у нас нет самого приложения. Начал гуглить, и вновь не обнаружил ничего стоящего. В всеобщем пришлось собирать информацию по крупицам, и теперь я хочу поделиться своим навыком с вами.

Зависимости

Первое, что нам желанно сделать — сделать новейший репозиторий для нашего бандла и добавить в него файлы к нему относящиеся. Наш бандл, безусловно-же, имеет внешние зависимости. Для их разрешения мы будем применять composer. У меня он установлен глобально сделайте поправку на это. Начнем:

$ composer init #Следуем указаниям 

Мы инициализаровали наш план. В корневой директории был сделан файл composer.json. В нем есть несколько сегментов увлекательных нам: requirerequire-devsuggest. Пройдемся по всякой из них:

  • require — то, без чего наш план не может трудиться
  • require-dev — то, что мы используем для разработки и тестирования
  • suggest — здесь вы можете сказать, что ваш бандл может трудиться, скажем, не только с ORM но и ODM

Установим надобные компоненты командой
$ composer install 
Отлично, с зависимостями разобрались.

Ядро

Для тестирования сервисов и функционального тестирования нам потребуется фактически полнофункциональное приложение.

Автозагрузка классов

Нам потребуется сделать свой bootstrap.php в директории с нашими тестами и указать, что phpunit должен применять именно его.

<?php

use DoctrineCommonAnnotationsAnnotationRegistry; //Только если вы используете Doctrine и анотации
use ComposerAutoloadClassLoader;

/**
 * @var ClassLoader $loader
 */
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader(array($loader, 'loadClass')); //Только если вы используете Doctrine и аннотации

return $loader;

Еще раз хочу обратить ваше внимание на строкуAnnotationRegistry::registerLoader(array($loader, 'loadClass'));. Мой бандл во всю использует Doctrine и аннотации и для меня было огромным изумлением, когда я раз за разом получал исключение с тектом «Annotation can not be loaded».

Открываем наш phpunit.xml.dist и указываем где наш лежит наш bootstrap.php

<phpunit bootstrap="./Tests/bootstrap.php">

 

AppKernel и Консоль

Дальнейшим шагом будет инициализация приложения. Я сотворил папку Tests/fixtures где будут лежать файлы относящиеся к нашему приложению для тестов. Ключевым классом всякого symfony приложения является AppKernel, сотворим его в папке Tests/fixtures/app

<?php

use SymfonyComponentHttpKernelKernel;
use SymfonyComponentConfigLoaderLoaderInterface;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelHttpKernelInterface;

class AppKernel extends Kernel
{
/**
 * @return array
 */
    public function registerBundles()
    {
        $bundles = array(
             //Указываем какие бандлы нам нужны
        );

        return $bundles;
    }
    /**
     * @param SymfonyComponentConfigLoaderLoaderInterface $loader
     */
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__ . '/config/config.yml');
    }
} 

Дальше нам нужно будет сконфигурировать наш контейнер, для этого сделаем файлTests/fixtures/app/config/config.yml.

Если вам необходима консоль, легко сделайте файл Tests/fixtures/app/console со дальнейшим содержанием:

#!/usr/bin/env php
<?php

// if you don't want to setup permissions the proper way, just uncomment the following PHP line
// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
//umask(0000);

set_time_limit(0);

require_once __DIR__.'/../../bootstrap.php';
require_once __DIR__.'/AppKernel.php';

use SymfonyBundleFrameworkBundleConsoleApplication;
use SymfonyComponentConsoleInputArgvInput;
use SymfonyComponentDebugDebug;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod';

if ($debug) {
    Debug::enable();
}

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run($input);

Сейчас укажем где находится ядро нашего приложения, добавляем в phpunit.xml.dist следующую директиву:

<php>
    <server name="KERNEL_DIR" value="Tests/Fixtures/app/" />
</php>

Позже этих нехитрых манипуляций мы получили наше тестовое приложение и открыли дорогу для примененияSymfonyBundleFrameworkBundleTestWebTestCase, с поддержкой которого мы сумеем тестировать наши сервисы и другое в контексте Symfony 2 приложения.

Ознакомиться с полным кодом дозволено здесь

PS: В дальнейшей статье я постараюсь расрыть тонкости тестирования Doctrine в наших бандлах.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB