Phpunit 如何操作控制器测试的应用程序配置?
我正在为ZF3应用程序编写功能/控制器测试(由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); } 它运行得很好。但现在我遇到了一个案例,我需要使用多个互斥配置来测试应用程序 例如,“身份验证”案例:应用程序提供多种
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',
],
];