0

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');

コントローラーのテストケース:

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

コントローラーのテストを機能させるために何をする必要があるかについてのヒントをいただければ幸いです。

編集:私のディレクトリ構造は次のようになります(特定の理由でクラスを異なるライブラリに分けました)

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

私のインクルードパスは実際には次のようになります:

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())));
4

2 に答える 2

1

私自身のクラスでは、関数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ます。それが、あなたのコードと私自身のコードの違いです。問題が解決しない場合は、パス設定がオフになっている可能性があります。

于 2011-10-28T09:24:02.040 に答える
0

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';

...そしてコントローラーTestCase:

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.........
}

ブートストラップにインクルード パスを追加し、カスタム テスト オートローダーを spl_autoloader に登録する必要があります。また、忘れずに phpunit を開始してください-c test/phpunit.xml

于 2012-02-20T21:45:07.160 に答える