我试图为需要在测试运行期间进行特定配置更改的模块编写测试,覆盖模块自己的module.config.php
提供的默认配置。
在正常的应用程序运行中,配置按顺序合并,我可以使用config/autoload/*.local.php
来取代模块的配置。但是在phpunit运行期间,这些文件没有被加载,我无法在测试运行时找到修改它的方法。
我尝试修改我的Bootstrap文件中的配置,但无济于事;甚至直接在测试控制器设置中:
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);
}
实现这个目标的正确方法是什么?
答案 0 :(得分:1)
我个人采用与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
个文件。
当然,这种模式也可以很容易地改变为测试环境。还值得注意的是,通过这种方法,您也可以更改其他应用程序设置(例如,要加载应用程序配置缓存/模块)。