我正在为ZF3应用程序编写功能/控制器测试(由PHPUnit和zendframework/zend-test驱动)。如下所示:
public function testWhatEver()
{
$this->dispatch('/');
$this->assertResponseStatusCode(Response::STATUS_CODE_200);
}效果很好。但是现在我遇到了一个案例,我需要用多个相互排斥的信任来测试应用程序。
例如,“身份验证”:应用程序提供多个身份验证方法(比方说:AuthA、AuthB、AuthC)。(这是通过在配置文件中设置auth.type值来配置的。)我想测试它们中的每一个。这意味着,在/config/autoload/test/*{local|global}.php中拥有特殊的测试信任是不够的。我需要能够为每个测试操作它们(在调用dispatch(...)方法之前)。
如何操作应用程序信任控制器测试(动态)?
如果找不到更好的解决方案,可能的解决办法是在每次测试之前编辑配置文件(使用file_put_contents(...)或类似的方法)。但它有点丑(慢)。
发布于 2020-02-28 17:07:04
总的来说,我认为这个问题没有很好的解决办法。但也有一些或多或少可以接受的解决办法:
解决方案1:为每个测试操作相应的配置文件
$configs = file_get_contents(...)searchByRegexAndManipulateConfigs(...)file_put_contents(...)这需要付出很大的努力,并且会使测试变得更慢(因为从文件系统读取/写入文件系统)。
解决方案2:只有一个配置值的简单文件
我们可以创建像config.auth.type.php或config.auth.type.txt这样的文件(每个配置值都有一个文件),并在配置中使用inclue或file_get_contents(...)调用作为值。在执行测试之前,需要对文件中的值进行操作。
这稍微少了一点努力(我们不需要编写复杂的RegEx),但可能会使测试速度慢得多,因为每个应用程序请求都会从读取一个额外的文件开始。
GLOBALS 3:通过传递信任值
这是最简单也是最快的变体。我们只需将所需的值保存到全局变量中,并在config (File)数组中读取它。测试结束后,我们移除变量:
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',
],
];https://stackoverflow.com/questions/60439319
复制相似问题