在phpunit测试中重写zf2模块配置


overriding zf2 modules configuration in phpunit test

我正在尝试为测试运行期间需要特定配置更改的模块编写测试,覆盖由模块自己的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文件。

当然,该模式也可以很容易地更改到测试环境中。同样值得注意的是,通过这种方法,你也可以更改其他应用程序设置(例如,应用程序配置缓存/加载模块)。