Zend 2の公式ドキュメント$this->setApplicationConfig()
のように、メソッドへのアプリケーション構成パスのハードコーディングを座っているのは非常に悪いコードです。
この問題を解決するには、Bootstrap クラスのメソッドを同じ Zend 2 公式ドキュメントに使用する@slawojの回答を使用して、アプリケーション構成パスを取得できます。findParentPath($path)
別の答えがありますが、より良いかもしれません:
同じBootstrap クラスを Zend 2 Official Docに使用し、アプリケーション構成配列を保存する静的メンバーを追加して、それを使用してサービス マネージャーの静的メンバーを開始します。
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();
}
}
最後の説明で最初の疑問が解決しますように
パスをハードコーディングせずに、単体テストのsetUpメソッドでアプリケーション構成を取得するにはどうすればよいですか?
他の手: 2 番目の質問について
そもそもなぜ実際にアクセスする必要があるのですか。アプリケーションではなく、モジュールをテストしています
テストケースクラスのほとんどに推奨されているように、彼らがZend 2の公式ドキュメントに言ったAbstractHttpControllerTestCase
ようにクラスが拡張されます
ここAbstractHttpControllerTestCase
で拡張するクラスは、アプリケーション自体のセットアップを支援し、リクエスト中に発生するディスパッチやその他のタスクを支援し、リクエスト パラメータ、レスポンス ヘッダー、リダイレクトなどをアサートするメソッドを提供します。
したがって、テストケースクラスは、インスタンスgetApplicationServiceLocator()
を取得するためにZend\ServiceManager\ServiceManager
使用するか、http リクエストのインスタンスgetRequest()
を取得するために使用するか、HTTP 応答のために使用することができます。すべてのこのメソッドは、アプリケーション構成を使用してオブジェクトを開始するメソッドを内部的に使用します。次に、テストケースのメソッドにメソッドを使用する必要がありますアプリケーション構成を設定するクラス。Zend\Stdlib\RequestInterface
getResponse()
Zend\Stdlib\ResponseInterface
getApplication()
Zend\Mvc\ApplicationInterface
$this->setApplicationConfig()
setUp()
私が例としてそれらを与えたすべてのメソッドは、AbstractControllerTestCase
どのAbstractHttpControllerTestCase
クラスに割り当てられてそれを拡張します。