Тестирование приложений, использующих doctrine/doctrine-orm-module
Для тестирования приложений на zf2, использующих для работы с Doctrine2 doctrine/doctrine-orm-module, применяется специальный класс \Nnx\ZF2TestToolkit\Listener\InitTestAppListener.
InitTestAppListener одновременно является как обработчиком событий PhpUnit, так и обработчиком событий приложения на zf2.
Данный класс позволяет конфигурировать настройки соедениния doctrine через конфиг phpunit.
Алгоритм работы
При старте тестов в конструктор InitTestAppListener из PhpUnit-движка передаются следующие параметры: connectionName, driverClass, params. Эти данные сохраняются в статических свойствах класса.
Далее при старте тестового приложения на zf2 при возникновении события onBootstrap InitTestAppListener объеденяет конфиг приложения с массивом вида:
[
'doctrine' => [
'connection' => [
$connectionName => [
'driverClass' => $driverClass,
'params' => $params
]
]
]
]
Где $connectionName, $driverClass, $params берутся из соответствующих настроек InitTestAppListener в phpunit.xml
Пример использования
Подключить InitTestAppListener в качестве обработчика событий PhpUnit'a
<?xml version="1.0"?>
<phpunit>
<testsuites>
<testsuite name="Test Suite">
<directory>./test/phpunit/tests</directory>
</testsuite>
</testsuites>
<filter>
<blacklist>
<directory>./vendor</directory>
<directory>./test</directory>
</blacklist>
</filter>
<logging>
<listeners>
<listener class="\Nnx\ZF2TestToolkit\Listener\InitTestAppListener">
<arguments>
<!-- Имя соеденения, которое можно получить через сервис doctrine.connection.ИМЯ_СОЕДЕНЕНИЯ -->
<string>test</string>
<!-- Используемый драйвер -->
<string>\Doctrine\DBAL\Driver\PDOMySql\Driver</string>
<array>
<element key="host">
<string>test_hosts</string>
</element>
<element key="port">
<string>test_port</string>
</element>
<element key="user">
<string>test_user</string>
</element>
<element key="password">
<string>test_password</string>
</element>
<element key="dbname">
<string>test_database_name</string>
</element>
</array>
</arguments>
</listener>
</listeners>
</phpunit>
Через конфиг PhpUnit'а можно передать следующие параметры:
Порядковый номер параметра | Имя | Тип | Описание |
---|---|---|---|
1 | connectionName | string | Имя соеденения doctrine (@see 'doctrine.connection.CONNECTION_NAME' в doctrine-orm-module ) |
2 | driverClass | string | Имя используемого драйвера (@see классы в \Doctrine\DBAL\Driver) |
3 | params | array | Параметры соеденения, специфичные для конкретной базы данных (host, port, user и т.д.) |
Важно соблюдать порядок аргументов!
Подключить InitTestAppListener в качестве обработчика события для тестового приложения
Предположим, что есть тестовое приложение DefaultApp (ниже приведена структура каталогов проекта):
project
config
doc
src
test
phpunit
_files
DefaultApp
config
autoload
global.php
application.config.php
tests
DefaultAppTest.php
Bootstrap.php
vendor
phpunit.xml
Есть набор тестов, расположенных в файле DefaultAppTest.php. В этих тестах необходимо поднимать приложение на zf2 с определенной конфигураций. Само приложение расположено в директории DefaultApp в папке _files. Предполагается, что тестовое приложение использует Doctrine. Тогда для того чтобы настройки соединения брались из phpunit.xml, необходимо в application.config.php тестового приложения добавить InitTestAppListener:
use Nnx\Doctrine\PhpUnit\TestData\TestPaths;
use Nnx\ZF2TestToolkit\Listener\InitTestAppListener;
return [
'modules' => [
'DoctrineModule',
'DoctrineORMModule',
'Nnx\\Doctrine'
],
'module_listener_options' => [
'module_paths' => [
'Nnx\\ModuleOptions' => TestPaths::getPathToModule(),
],
'config_glob_paths' => [
__DIR__ . '/config/autoload/{{,*.}global,{,*.}local}.php',
],
],
'service_manager' => [
'invokables' => [
InitTestAppListener::class => InitTestAppListener::class
]
],
'listeners' => [
InitTestAppListener::class
]
];
InitTestAppListener необходимо: - Зарегистрировать в ServiceLocator приложения (секция service_manager); - Добавить его в обработчики события приложения (listeners).