ZendFrameworkによるコントローラテストのセットアップ:オートローダの問題

私はZend Framework v1.11.0でWebアプリケーションを開発していますが、コントローラテストのための正しいテスト環境を設定することができません。 私はすでにZendテストの設定について多くの質問があることを知っていますが、数時間の研究の後には、これらのどれも私の問題を解決しませんでした。 だからここに私のコードです:

テストブートストラップ:

<?php
error_reporting(E_ALL | E_STRICT);

defined('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__).'/../../application'));
define('APPLICATION_ENV', 'testing');
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library'), get_include_path())));

require_once ('Zend/Application.php');
require_once ('ControllerTestCase.php');

ControllerTestCase:

class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {

  public $application;

  public function setUp() {
    $this->bootstrap = array($this, 'appBootstrap');
    parent::setUp();
  }

  public function appBootstrap() {
    $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH.'/configs/application.ini');
    $this->application->bootstrap();
  }
}

簡単なテスト:

class IndexControllerTest extends ControllerTestCase {
    public function testDefaultShouldInvokeIndexAction()
    {
        $this->dispatch('/');
        $this->assertModule('default');
        $this->assertController('index');
        $this->assertAction('index');
    }
}

このテストを実行するたびに、PHPUnitはIndexControllerで使用されているライブラリ内のクラスを見つけられないという致命的なエラーメッセージをスローします。したがって、理由はオートローダーに関連したものでなければならないと私は思った。デバッグ後、テストは通常​​のブートストラップ、トラフ、Authプラグインなどを介して実行され、ライブラリ含まれていることがわかりました。だから私はPHPUnitの問題が何であるか分かりません。ブラウザではすべて正常に動作し、コマンドラインではコントローラ以外のテスト(グローバル設定など)でも動作します。

私は私のコントローラーテストの作業をするために何をする必要があるのか​​について、何かヒントがあることにとても感謝しています!

編集:私のディレクトリ構造はこのように見えます(私はクラスをいくつかの理由で別のライブラリに分けました)

project
 - library1
 - library2
 - project_name
    ->application
    ->library3
    ->library4
    ->tests
       ->>application
          ->>>ControllerTestCase.php
          ->>>Bootstrap.php
       ->>Controller
          ->>>IndexControllerTest.php

私のincludeパスは実際には次のように見えます:

set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library3'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../library4'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library1'), get_include_path())));
set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH.'/../../library2'), get_include_path())));
0

2 答え

私自身の ControllerTestCase クラスでは、 setUp 関数の代わりにコンストラクタでブートストラップオブジェクトを設定しました。あなたのために、これを変えることを意味するでしょう

public function setUp() {
    $this->bootstrap = array($this, 'appBootstrap');
    parent::setUp();
}

public function __construct()
{
    $this->bootstrap = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
}

appBootstrap メソッドを削除します。それはあなたのコードと自分のコードの間に見られる唯一の違いです。私は問題を解決しません、あなたのパス設定がオフになっている可能性があります。

1
追加された
ディレクトリ構造の概要を投稿することはできますか?あなたのライブラリ、アプリケーション、テストコード。
追加された 著者 Jan-Henk,
あなたの質問に編集したset_include_path()への4回の呼び出しは、テストブートストラップファイルでも実行されていますか?あなたが提供したコードサンプルでは、​​1回の呼び出ししかないので。
追加された 著者 Jan-Henk,
ご回答有難うございます!私はこの変更を試みましたが、同じエラーが表示されます。私はパスの設定を見ていきますが、ブラウザで動作するので、私は彼らが正しいと確信しています。
追加された 著者 nick,
はい、私は質問にそれを編集しました。
追加された 著者 nick,
はい、それらは含まれています、私はコードを簡潔にするために短縮しました
追加された 著者 nick,

Zend Controllerのテストケースを正しく設定する最も簡単な方法は、zfツールを使用することです。コントローラーを作成することで、自動的に生成されたテストケースを得ることができます。

zf create controller name index-action-included[=1] module

次のブートストラップが作成されます。

    defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';

...とcontrollerTestCase:

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

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

    ....tests.........
}

You have to add the include paths in the bootstrap and register any custom test autoloaders with spl_autoloader. Also, remember to start phpunit with -c test/phpunit.xml

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com