2

Zend Framework で使用するために作成したライブラリがあります。その中に、Company/Controller/Action.phpすべてのアプリケーションコントローラーが拡張されているものがあります。これは非常に単純で、コントローラーに何かを注入するだけです (Doctrine のエンティティーマネージャーなど)。

単体テストを機能させようとしていますが、Company_Controller_Actionクラス内からブートストラップを取得できないという問題に遭遇しました (これは を拡張しますZend_Controller_Action):

function preDispatch() 
{
  $bootstrap = $this->getInvokeArg('bootstrap');
}

$bootstrapこの時点で null です。誰にも理由がありますか?ブートストラップが呼び出され、フロント コントローラーをフェッチできることを確認しましたが、ブートストラップを取得できません (getInvokeArg またはフロント コントローラーのいずれかを使用)。

これは、通常の本番環境および開発環境で機能します。私の application.ini のテスト セクションは、本番環境から継承しているだけなので、同じはずです。

これは私が私の中でやっていることですsetUp():

public function setUp()
{
    $this->bootstrap = new Zend_Application(
        'testing',
        APPLICATION_PATH . '/configs/application.ini'
    );
    parent::setUp();
}

私の Bootstrap.php:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

私のphpunit.xml:

<phpunit bootstrap="./Bootstrap.php" colors="true">
    <testsuite name="Application Test Suite">
        <directory>./application</directory>
    </testsuite>
    <filter>
        <whitelist>
            <directory suffix=".php">../application/</directory>
            <exclude>
                <directory suffix=".php">../application/Entities</directory>
                <directory suffix=".php">../application/modules/default/views</directory>
                <file>../application/Bootstrap.php</file>
                <file>../application/modules/default/controllers/ErrorController.php</file>
            </exclude>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./log/report" title="PrintConcept" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
        <log type="testdox" target="./log/testdox.html" />
    </logging>
</phpunit>

更新:上記の構成を使用すると、 My$bootstrapは null ではなくなりました。

4

1 に答える 1

5

数週間前に Zend のバグ トラッカーで見たのを思い出すと、これはバグでした。

多くの人に有効な修正方法は次のとおりです。

Bootstrap.php でフロント コントローラーを初期化します。

protected function _initFrontController()
{

    $frontControllerInstance = Zend_Controller_Front::getInstance();

    //If bootstrap is NULL or set to null then, set it.
    if(is_null($frontControllerInstance->getParam('bootstrap'))) {
        $frontControllerInstance->setParam('bootstrap', $this);
    }
    return $frontControllerInstance;
}

編集:

この問題について簡単なGoogleを実行しました。同様の回避策(上記とほぼ同じ)を取得しました。また、stackoverflowに関するこの回答も役立つ可能性があります。この回答によれば、アクションヘルパーを介して呼び出すことができます。

于 2012-08-22T03:56:11.957 に答える