Phpunit 如何操作控制器测试的应用程序配置?

Phpunit 如何操作控制器测试的应用程序配置?,phpunit,zend-framework3,zend-test,controller-tests,Phpunit,Zend Framework3,Zend Test,Controller Tests,我正在为ZF3应用程序编写功能/控制器测试(由PHPUnit和zendframework/zend测试驱动)。像这样: public function testWhatEver() { $this->dispatch('/'); $this->assertResponseStatusCode(Response::STATUS_CODE_200); } 它运行得很好。但现在我遇到了一个案例,我需要使用多个互斥配置来测试应用程序 例如,“身份验证”案例:应用程序提供多种

我正在为ZF3应用程序编写功能/控制器测试(由PHPUnit和
zendframework/zend测试驱动)。像这样:

public function testWhatEver()
{
    $this->dispatch('/');
    $this->assertResponseStatusCode(Response::STATUS_CODE_200);
}
它运行得很好。但现在我遇到了一个案例,我需要使用多个互斥配置来测试应用程序

例如,“身份验证”案例:应用程序提供多种身份验证方法(例如:
AuthA
AuthB
AuthC
)。(这可以通过在配置文件中设置
auth.type
的值来配置。)我想测试它们中的每一个。这意味着,在
/config/autoload/test/*{local | global}.php
中配置特殊的测试是不够的。我需要能够为每个测试操作它们(在调用
dispatch(…)
方法之前)

如何操作控制器测试的应用程序配置(在运行中)?



如果找不到更好的解决方案,可能的解决方法是在每次测试之前编辑配置文件(通过使用
file\u put\u contents(…)
或类似的方法)。但是它有点难看(而且速度慢)。

一般来说,我看不到解决这个问题的好办法。但有一些或多或少可以接受的解决办法:

解决方案1:为每个测试操作相应的配置文件

  • $configs=file\u get\u contents(…)
  • searchByRegexandManufactionFigures(…)
  • 文件内容(…)
  • 这需要很大的努力,并且会使测试速度变慢(由于从文件系统读取/写入文件系统)

    解决方案2:只有一个配置值的简单文件

    我们可以创建像
    config.auth.type.php
    config.auth.type.txt
    (每个配置值一个)这样的文件,并使用
    include
    文件获取内容(…)
    在配置中作为值调用。在执行测试之前,需要对文件中的值进行操作

    这稍微省力一点(我们不需要编写复杂的正则表达式),但可能会使测试速度大大降低,因为每个应用程序请求都会从读取额外的文件开始

    解决方案3:通过
    GLOBALS传递配置值

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];
    
    它是最简单、最快的变体。我们只需将所需的值保存到一个全局变量中,并在config(文件)数组中读取它。测试后,我们删除变量:

    AuthBTest

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];
    
    /config/autoload/test/local.php

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];
    

    总的来说,我认为这个问题没有很好的解决方案。但有一些或多或少可以接受的解决办法:

    解决方案1:为每个测试操作相应的配置文件

  • $configs=file\u get\u contents(…)
  • searchByRegexandManufactionFigures(…)
  • 文件内容(…)
  • 这需要很大的努力,并且会使测试速度变慢(由于从文件系统读取/写入文件系统)

    解决方案2:只有一个配置值的简单文件

    我们可以创建像
    config.auth.type.php
    config.auth.type.txt
    (每个配置值一个)这样的文件,并使用
    include
    文件获取内容(…)
    在配置中作为值调用。在执行测试之前,需要对文件中的值进行操作

    这稍微省力一点(我们不需要编写复杂的正则表达式),但可能会使测试速度大大降低,因为每个应用程序请求都会从读取额外的文件开始

    解决方案3:通过
    GLOBALS传递配置值

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];
    
    它是最简单、最快的变体。我们只需将所需的值保存到一个全局变量中,并在config(文件)数组中读取它。测试后,我们删除变量:

    AuthBTest

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];
    
    /config/autoload/test/local.php

    ...
    protected function setUp() // or setUpBeforeClass()
    {
        parent::setUp();
        $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
    }
    
    protected function tearDown() // or tearDownAfterClass()
    {
        parent::tearDown();
        unset($GLOBALS['appTestConfigs']);
    }
    ...
    
    return [
        'auth' => [
            'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
        ],
    ];