2

えー、これは髪が抜ける…

私はzf1でいくつかの便利なことをしましたが、今はzf2に切り替えるのに苦労しています。正しく行うために、TDDスタイルで物事を成し遂げたいと思っています。

Skeleton アプリケーションをセットアップし、「Weather」と「Airport」という 2 つの追加モジュールを作成しました。私は、正常に動作する WeatherController のテスト ケースを作成しました。Airport モジュール内のモデルのテスト ケースを作成したところ、次のエラーで失敗しました。

Fatal error: Class 'Airport\Model\Airport' not found in C:\xampp\htdocs...

、そしてエラーはここでトリガーされます(AirportTableTest.php):

<?php

namespace AirportTest\Model;

use Airport\Model\Airport;
use Airport\Model\AirportTable;
use PHPUnit_Framework_TestCase;

class AirportTableTest extends PHPUnit_Framework_TestCase {   

    public function testExample() {
        $airport = new Airport(); // - this is not getting loaded and throws the fatal error :(
    }

}

コードは、ZF2 チュートリアルの Album モジュールの例に基づいています。AirportTable モデルは、DB 内の SQL テーブルに接続することになっています。Airport モデルは、チュートリアルで作成された Album モデルと同じように作成されます。ディレクトリ構造は(省略):

/module
  /Airport
    /src
      /Airport
        /Controller
        /Model
          AirportTable.php
          Airport.php
  /Application
  /Weather
/public
/tests
  /module
    /Airport
      /src
        /Airport
          /Controller
          /Model
            AirportTableTest.php
            AirportTest.php
    /Application
    /Weather
  bootstrap.php
  phpunit.xml
/vendor

tests ディレクトリの bootstrap.php :

<?php
chdir(dirname(__DIR__));
error_reporting(E_ALL | E_STRICT);
include __DIR__.'/../init_autoloader.php';

ロードされていないクラスを含む Airport.php :

<?php
namespace Airport\Model;

class Airport
{
    public $icao;
    public $lat;
    public $lng;
    public $metar;

    public function exchangeArray($data){
        $this->icao = (isset($data['id'])) ? $data['icao'] : null;
        $this->lat = (isset($data['lat'])) ? $data['lat'] : null;
        $this->lng  = (isset($data['lng'])) ? $data['lng'] : null;
        $this->metar = (isset($data['metar'])) ? $data['metar'] : null;
    }
}
?>

Airport モジュールの Module.php :

<?php
namespace Airport;

use Airport\Model\Airport;
use Airport\Model\AirportTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;

class Module
{
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Airport\Model\AirportTable' =>  function($sm) {
                    $tableGateway = $sm->get('AirportTableGateway');
                    $table = new AirportTable($tableGateway);
                    return $table;
                },
                'AirportTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Airport());
                    return new TableGateway('airport', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }

}

したがって、おそらく関連するオートローダーのような、かなり明白なものが欠けているのではないでしょうか? それで、うーん...多分助けて(かなりお願いします)?

4

2 に答える 2

1

すっごく、私は実用的な解決策を思いつきましたが、それが賢いのか完全に遅れているのかはよくわかりません.

Zend Framework 2モジュールを備えたPHPUnitに基づいて、次の行を追加しました

Zend\Mvc\Application::init(include '/../config/application.config.php');

テストスイートのbootstrap.phpに追加すると、すべてが期待どおりに機能するようになりましたが、「空港」モジュールではなく「天気」モジュールに対してこの行がないと機能する理由がまったくわかりません...

于 2013-05-01T09:47:08.810 に答える
0

ZF2 入門チュートリアルでテストをレイアウトする方法を確認することをお勧めします。チュートリアルを完了し、ZF2 スケルトン アプリケーション ソースの自分のフォークに変更をコミットしました。

基本的に、各モジュールには独自のテスト スイートがあり、構成を含む専用の Bootstrap ファイルとphpunit.xml、テストの実行時にこれらすべてをロードするように PHPUnit に指示します (実行時に tests ディレクトリにいる限りphpunit)。これは、テストをモジュール化するのに役立ちます。

于 2013-05-03T01:43:06.177 に答える