zend tutorial framework unit-testing phpunit zend-framework2 configuration-files

unit-testing - zend framework tutorial



¿PHPUnit ignora los archivos config/autoload/... en Zend Framework 2? (2)

En mi aplicación ZF2 estoy siguiendo el enfoque "estándar" manejando las configuraciones. Existen:

  • /config/application.config.php - configuración amplia de la aplicación predeterminada

  • /config/autoload/global.php : configuración amplia de la aplicación predeterminada

  • /config/autoload/local.php - amplia configuración de aplicaciones específicas del entorno

  • /config/autoload/MODULENAME.local.php - configuración específica del módulo específico del entorno

  • /module/MODULENAME/config/module.config.php - configuración específica del módulo predeterminado

Ahora, cuando inicio PHPUnit en una carpeta de prueba de módulo, no puedo usar los valores de global.php ni los valores de la s local (aunque los archivos de configuración están incluidos, lo he comprobado).

Por ejemplo: PHPUnit llama a mi vista personalizada helper ContentForEnvironment , que contiene este código: $currentEnvironment = $this->serviceManager->getServiceLocator()->get(''Config'')[''environment'']; .

/path/to/project/module/Application/test# phpunit PHPUnit 3.7.13 by Sebastian Bergmann. Configuration read from /path/to/project/module/Application/test/phpunit.xml E Time: 0 seconds, Memory: 8.75Mb There was 1 error: 1) ApplicationTest/Controller/IndexControllerTest::testIndexActionCanBeAccessed Undefined index: environment /path/to/project/vendor/MyNamespace/library/MyNamespace/View/Helper/ContentForEnvironment.php:32 /path/to/project/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php:400 /path/to/project/module/Application/view/layout/layout.phtml:25 /path/to/project/module/Application/view/layout/layout.phtml:25 /path/to/project/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php:507 /path/to/project/vendor/zendframework/zendframework/library/Zend/View/View.php:205 /path/to/project/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php:126 /path/to/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:472 /path/to/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:207 /path/to/project/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php:136 /path/to/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:472 /path/to/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:207 /path/to/project/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php:332 /path/to/project/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php:285 /path/to/project/vendor/zendframework/zendframework/library/Zend/Test/PHPUnit/Controller/AbstractControllerTestCase.php:255 /path/to/project/module/Application/test/ApplicationTest/Controller/IndexControllerTest.php:46 FAILURES! Tests: 1, Assertions: 0, Errors: 1.

La opción de environment se establece en global.php y local.php y funciona cuando ejecuto la aplicación en el navegador.

Cuando configuro la opción en un archivo de configuración específico del módulo predeterminado ( module.config.php ), se puede leer el valor de configuración.

¿Qué está mal aquí?

EDITAR

/module/Application/test/Bootstrap.php

<?php namespace ApplicationTest; use Zend/Loader/AutoloaderFactory; use Zend/Mvc/Service/ServiceManagerConfig; use Zend/ServiceManager/ServiceManager; use Zend/Stdlib/ArrayUtils; use RuntimeException; error_reporting(E_ALL | E_STRICT); chdir(__DIR__); class Bootstrap { protected static $serviceManager; protected static $config; protected static $bootstrap; public static function init() { // Load the user-defined test configuration file, if it exists; otherwise, load if (is_readable(__DIR__ . ''/phpunit.config.php'')) { $testConfig = include __DIR__ . ''/phpunit.config.php''; } else { $testConfig = include __DIR__ . ''/phpunit.config.php.dist''; } $zf2ModulePaths = array(); if (isset($testConfig[''module_listener_options''][''module_paths''])) { $modulePaths = $testConfig[''module_listener_options''][''module_paths'']; foreach ($modulePaths as $modulePath) { if (($path = static::findParentPath($modulePath)) ) { $zf2ModulePaths[] = $path; } } } $zf2ModulePaths = implode(PATH_SEPARATOR, $zf2ModulePaths) . PATH_SEPARATOR; $zf2ModulePaths .= getenv(''ZF2_MODULES_TEST_PATHS'') ?: (defined(''ZF2_MODULES_TEST_PATHS'') ? ZF2_MODULES_TEST_PATHS : ''''); static::initAutoloader(); // use ModuleManager to load this module and it''s dependencies $baseConfig = array( ''module_listener_options'' => array( ''module_paths'' => explode(PATH_SEPARATOR, $zf2ModulePaths), ), ); $config = ArrayUtils::merge($baseConfig, $testConfig); $serviceManager = new ServiceManager(new ServiceManagerConfig()); $serviceManager->setService(''ApplicationConfig'', $config); $serviceManager->get(''ModuleManager'')->loadModules(); static::$serviceManager = $serviceManager; static::$config = $config; } public static function getServiceManager() { return static::$serviceManager; } public static function getConfig() { return static::$config; } protected static function initAutoloader() { $vendorPath = static::findParentPath(''vendor''); if (is_readable($vendorPath . ''/autoload.php'')) { $loader = include $vendorPath . ''/autoload.php''; } else { $zf2Path = getenv(''ZF2_PATH'') ?: (defined(''ZF2_PATH'') ? ZF2_PATH : (is_dir($vendorPath . ''/ZF2/library'') ? $vendorPath . ''/ZF2/library'' : false)); if (!$zf2Path) { throw new RuntimeException(''Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.''); } include $zf2Path . ''/Zend/Loader/AutoloaderFactory.php''; } AutoloaderFactory::factory(array( ''Zend/Loader/StandardAutoloader'' => array( ''autoregister_zf'' => true, ''namespaces'' => array( __NAMESPACE__ => __DIR__ . ''/'' . __NAMESPACE__, ), ), )); } protected static function findParentPath($path) { $dir = __DIR__; $previousDir = ''.''; while (!is_dir($dir . ''/'' . $path)) { $dir = dirname($dir); if ($previousDir === $dir) return false; $previousDir = $dir; } return $dir . ''/'' . $path; } } Bootstrap::init();

/module/Application/test/phpunit.config.php

<?php return array( ''modules'' => array( ''Application'', ), ''module_listener_options'' => array( ''config_glob_paths'' => array( ''../../../config/autoload/{,*.}{global,local}.php'', ), ''module_paths'' => array( ''module'', ''vendor'', ), ), );

/module/Application/test/phpunit.xml

<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="Bootstrap.php"> <testsuites> <testsuite name="Application Unit Tests"> <directory>./ApplicationTest</directory> </testsuite> </testsuites> <filter> <whitelist> <directory>/path/to/project/module/Application/src/Application/</directory> <!-- <exclude> <directory suffix=".phtml">/path/to/project/module/Application/</directory> <directory suffix=".php">/path/to/project/module/Application/test/</directory> </exclude> --> </whitelist> </filter> </phpunit>

EDITAR

Cambió el /module/Application/test/Bootstrap.php

// use ModuleManager to load this module and it''s dependencies $baseConfig = array( ''module_listener_options'' => array( ''module_paths'' => $zf2ModulePaths, ), ''modules'' => array( ''Application'', ) ); // Load the user-defined test configuration file, if it exists; otherwise, load if (is_readable(__DIR__ . ''/phpunit.config.php'')) { $testConfig = include __DIR__ . ''/phpunit.config.php''; } else { $testConfig = include __DIR__ . ''/phpunit.config.php.dist''; } $config = ArrayUtils::merge($baseConfig, $testConfig);

Pero los errores siguen ahí.


No estoy seguro de si esto es correcto, pero intenta darle una oportunidad. Simplemente comente esta línea en su Bootstrap de PHPUnit e intente ejecutar su prueba.

$config = ArrayUtils::merge($baseConfig, $testConfig);

Básicamente, supongo que explotará su $ testConfig en $ baseConfig y lo fusionará nuevamente con $ testConfig. Esto lo derrota. Por favor intente esto y hágamelo saber. Voy a tratar de ejecutar su configuración un poco más tarde.


Tuve el mismo problema, y ​​se resolvió con una simple línea en el controlador de prueba, método setUp.

$serviceManager = Bootstrap::getServiceManager(); $this->setApplicationConfig(Bootstrap::getConfig());

Mi controlador de prueba extiende AbstractHttpControllerTestCase, y yo uso el bootstrap que se encuentra en el sitio web zend.