1

Zend Framework 2 単体テスト チュートリアルを実行しているところです。単体テストをセットアップするプロセス中に、setUpメソッド内のアプリケーション構成へのハードコードされたパスを挿入します。

namespace AlbumTest\Controller;

use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;

class AlbumControllerTest extends AbstractHttpControllerTestCase
{
    public function setUp()
    {
        $this->setApplicationConfig(
            include '/var/www/zf2-tutorial/config/application.config.php'
        );
        parent::setUp();
    }
}

これが実際に行われ、例として使用されているとは信じられません。

setUp問題は、パスをハードコーディングせずに単体テストメソッドでアプリケーション構成を取得するにはどうすればよいですか?

アップデート:

これに関するもう 1 つの関連する質問は、「モジュール」の単体テストでアプリケーション構成にアクセスする必要があるのはなぜですか? この単一のモジュールに分離されるはずのモジュールの「単体テスト」ではありませんか?

更新 2:

しばらくいじった後、関連する問題を見つけました。Module.phpAlbum モジュールを作成するチュートリアルでは、 forgetAutoloaderConfigメソッドで config 構造を返すのではなく、Composer を使用してクラス マップを作成することが指摘されています。ただし、これを行うと、構成の一部が欠落しているため、単体テストは機能しません。問題のこの部分を解決するにautoload_classmap.phpは、モジュールのベース ディレクトリに を作成し、その中に空の配列を返す必要があります。getAutoloaderConfig次に、テストが機能するように、で概説されているコードを使用します。

ハードコーディングされたアプリケーション構成の問題に対する解決策をまだ見つけていません。また、そもそもなぜ実際にアクセスする必要があるのか​​ についてもわかりません。アプリケーションではなく、モジュールをテストしています。

4

3 に答える 3

1

私は常にhttp://framework.zend.com/manual/2.3/en/tutorials/unittesting.htmlから直接、以下に示す関数を使用します

protected static function findParentPath($path)
{
    $dir = __DIR__;
    $previousDir = '.';
    while (!is_dir($dir . '/' . $path)) {
        $dir = dirname($dir);
        if ($previousDir === $dir) {
            return false;
        }
        $previousDir = $dir;
    }
    return $dir . '/' . $path;
}

その関数を ControllerTest クラスに配置し、次のsetUpように関数で使用します。

public function setUp()
{
    $modulePath = static::findParentPath("module");
    $this->setApplicationConfig(
        include $modulePath . '/../config/application.config.php'
    );
    parent::setUp();
}
于 2014-12-13T21:16:23.513 に答える
1

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\RequestInterfacegetResponse()Zend\Stdlib\ResponseInterfacegetApplication()Zend\Mvc\ApplicationInterface$this->setApplicationConfig()setUp()

私が例としてそれらを与えたすべてのメソッドは、AbstractControllerTestCaseどのAbstractHttpControllerTestCaseクラスに割り当てられてそれを拡張します。

于 2016-01-19T20:28:29.527 に答える
0

試す :

include  dirname(dirname(dirname(dirname(dirname(__DIR__))))).'/config/application.config.php'
于 2013-06-02T02:10:50.970 に答える