1

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

public function testWhatEver()
{
    $this->dispatch('/');
    $this->assertResponseStatusCode(Response::STATUS_CODE_200);
}

它工作得很好。但是现在我遇到了一个案例,我需要使用多个互斥配置来测试应用程序。

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

如何操作控制器测试的应用程序配置/来自控制器测试(动态)?


如果找不到更好的解决方案,可能的解决方法是file_put_contents(...)在每次测试之前编辑配置文件(通过使用或类似的东西)。但这有点难看(而且很慢)。

4

1 回答 1

0

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

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

  1. $configs = file_get_contents(...)
  2. searchByRegexAndManipulateConfigs(...)
  3. file_put_contents(...)

这很费力并且会使测试变慢(由于读取/写入文件系统)。

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

我们可以创建类似config.auth.type.phpor的文件config.auth.type.txt(每个配置值一个,以保持文件非常简单)并在配置中使用incluefile_get_contents(...)调用作为值。文件中的值需要在测试执行之前进行操作。

它的工作量要少一些(我们不需要编写复杂的 RegEx),但可能会使测试变得相当慢,因为每个应用程序请求都会从读取一个附加文件开始。

解决方法 3:通过GLOBALS

这是最简单和最快的变体。我们只需将所需的值保存到全局变量中,然后在配置(文件)数组中读取它。测试后我们删除变量:

AuthBTest

...
protected function setUp() // or setUpBeforeClass()
{
    parent::setUp();
    $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
}

protected function tearDown() // or tearDownAfterClass()
{
    parent::tearDown();
    unset($GLOBALS['appTestConfigs']);
}
...

/config/autoload/test/local.php

return [
    'auth' => [
        'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
    ],
];
于 2020-02-28T17:07:04.277 回答