我正在尝试为测试运行期间需要特定配置更改的模块编写测试,覆盖由模块自己的module.config.php
提供的默认配置。
在正常的应用程序运行中,配置按顺序合并,我可以使用config/autoload/*.local.php
取代模块的配置。但是在phpunit运行期间,这些文件没有加载,并且我找不到在测试运行时修改它的方法。
我试图修改配置在我的引导文件,无济于事;甚至在测试控制器设置中直接:
public function setUp()
{
$app_config = include(Bootstrap::getRootPath() . '/config/application.config.php');
$test_config = Bootstrap::getTestConfig();
$new_config = ArrayUtils::merge($app_config, $test_config);
$this->setApplicationConfig($new_config);
}
但是当其中一个工厂运行时,我在调试会话期间检查配置的值,并且我注入的值无处可寻。
还尝试连接到EVENT_MERGE_CONFIG
并在那里修改它:
public static function onMergeConfig(ModuleEvent $e)
{
$configListener = $e->getConfigListener();
$config = $configListener->getMergedConfig(false);
$new_config = ArrayUtils::merge($config, $this->getTestConfig(static::$zf2ModulePaths));
// Pass the changed configuration back to the listener:
$configListener->setMergedConfig($new_config);
}
正确的方法是什么?
我个人采用与zfcampus/zf-development-mode类似的方法。根据环境的不同,我在应用程序配置中添加了另一个config_glob_paths
。当我使用它来管理与开发相关的配置时,它可以很容易地用于测试。
基本思想是有两个应用程序配置文件,一个是通用的,一个是特定于环境的(除了生产环境)。
application.config.php
:
return [
'modules' => [],
'module_listener_options' => [
'config_glob_paths' => [
__DIR__ . '/autoload/{{,*.}global,{,*.}local}.php',
],
'config_cache_enabled' => false,
'module_map_cache_enabled' => false,
],
];
development.config.php
:
return [
'modules' => [],
'module_listener_options' => [
'config_glob_paths' => [
'config/autoload/{,*.}{global,local}-development.php',
],
'config_cache_enabled' => false,
'module_map_cache_enabled' => false,
],
];
合并这两个文件,将自动加载符合以下顺序的文件:
'config_glob_paths' => [
__DIR__ . '/autoload/{{,*.}global,{,*.}local}.php',
'config/autoload/{,*.}{global,local}-development.php',
],
而后面的设置(后缀为-development
)将覆盖默认设置。
autoload
目录下有如下文件:
-
database.global.php
-
database.global-development.php
-
database.local.php
-
database.local-development.php
开发文件的加载顺序将是(如果存在):
-
database.global.php
-
database.local.php
-
database.global-development.php
-
database.local-development.php
在生产环境中,没有合并development.config.php
文件,因此没有加载*-development.php
文件。