在phpunit test中覆盖zf2模块配置

时间:2016-10-08 08:42:06

标签: php zend-framework2 phpunit

我试图为需要在测试运行期间进行特定配置更改的模块编写测试,覆盖模块自己的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);
}

实现这个目标的正确方法是什么?

1 个答案:

答案 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个文件。

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

相关问题