将应用程序配置路径硬编码到$this->setApplicationConfig()
方法中就像Zend 2 Official Doc是非常非常糟糕的代码。
为了解决这个问题,您可以使用@slawoj的答案,他们使用Bootstrap 类中的findParentPath($path)
方法进入同一个 Zend 2 官方文档来获取应用程序配置路径。
还有另一个答案,可能会更好:
在 Zend 2 官方文档中使用 Same Bootstrap 类,并添加一个静态成员保存应用程序配置数组,用于启动服务管理器静态成员。
引导程序.php
class Bootstrap
{
/**
* ServiceManger Static member
* @var ServiceManager
*/
private static $serviceManager;
/**
* Application Configuration static member
* @var array
*/
private static $applicationConfiguration;
/**
* Initialize Tests Bootstrap
*/
public static function init()
{
static::initAutoloader();
if (file_exists(static::findParentPath('code') . '/config/application.config.php')) {
// include application configuration
$configuration = require static::findParentPath('code') . '/config/application.config.php';
// initialize application configuration static member
static::$applicationConfiguration = $configuration;
// initialize service manager static member
$serviceManager = new ServiceManager(new ServiceManagerConfig());
$serviceManager->setService('ApplicationConfig', $configuration);
$serviceManager->get('ModuleManager')->loadModules();
static::$serviceManager = $serviceManager;
}
}
/**
* Get Application Service Manager
* @return ServiceManager
*/
public static function getServiceManager()
{
return static::$serviceManager;
}
/**
* Get Application Configuration
* @return array
*/
public static function getApplicationConfig()
{
return static::$applicationConfiguration;
}
/**
* Get Full Path include given path with it's parent path
* @param string $path path name which we want to get it's parent
* @return string
*/
public static function findParentPath($path)
{
$dir = __DIR__;
$previousDir = ".";
// loop on Directories Path until get parent path
while (!is_dir($dir . '/' . $path)) {
$dir = dirname($dir);
if ($previousDir == $dir) {
return false;
}
$previousDir = $dir;
}
return $dir . '/' . $path;
}
// ........
}
然后使用应用程序配置静态成员$this->setApplicationConfig()
方法。
你的 AlbumControllerTest 类
class AlbumControllerTest extends AbstractHttpControllerTestCase
{
public function setUp()
{
$this->setApplicationConfig(
Bootstrap::getApplicationConfig()
);
parent::setUp();
}
}
最后的解释可以解决你的第一个问题吗
如何在单元测试设置方法中获取应用程序配置而不对其路径进行硬编码?
在其他人手中:关于你的第二个问题
为什么实际上首先需要访问它。我正在测试一个模块,而不是一个应用程序
正如它向大多数测试用例类推荐的那样,AbstractHttpControllerTestCase
就像他们在 Zend 2 官方文档中所说的那样扩展
我们在这里扩展的AbstractHttpControllerTestCase
类帮助我们设置应用程序本身,帮助调度和请求期间发生的其他任务,以及提供断言请求参数、响应标头、重定向等的方法
因此,您的测试用例类可以getApplicationServiceLocator()
用来获取Zend\ServiceManager\ServiceManager
实例或用于获取getRequest()
httpZend\Stdlib\RequestInterface
请求或Http 响应的实例,所有这些方法都使用内部方法使用您的应用程序配置启动对象然后您需要将方法用于测试用例的方法类来设置您的应用程序配置。getResponse()
Zend\Stdlib\ResponseInterface
getApplication()
Zend\Mvc\ApplicationInterface
$this->setApplicationConfig()
setUp()
我给他们的所有方法作为示例,分配到AbstractControllerTestCase
哪个AbstractHttpControllerTestCase
类扩展它。