Проблемы с Zend Framework и PHPunit? - PullRequest
0 голосов
/ 25 января 2011

Когда я расширяю класс ZF, я получаю ошибки пути. Вот мой тест:

<?php
require_once ('Zend/Acl.php'); // gives error w/o
require_once ('../application/models/Acl.php');

class Model_AclTest extends ControllerTestCase
{

    /**
        * @var Model_Acl
        */
    protected $acl;

    public function setUp()
    {
        parent::setUp();
        $this->acl = new Model_Acl(2, 'sims');
    }

    public function testHasUsername()
    {
        echo $this->acl->username;
        $this->assert($this->acl->username);
    }
}

Вот класс Model_Acl:

class Model_Acl extends Zend_Acl
{
    private $username;
    private $userid;
    private $userroles;
    private $allroles;

    public function __construct($userid, $username)
    {
        if (method_exists(parent, '__construct')) parent::__construct();
        $this->username = $username;
        $this->userid = $userid;
        $this->setRoles();
        $this->setResources();
        $this->setPrivilages();
        return $this;
    }
...
}

Я получаю эту ошибку, если только мне не требуется 'Zend / Acl.php'.

PHP Fatal error:  Class 'Zend_Acl' not found in /mnt/dev/mragent/application/models/Acl.php on line 6

Так что я думаю, что, может быть, что-то еще не совсем понемногу, и продолжу с этим небольшим неудобством. Затем я получаю следующую ошибку от самого phpunit:

1) Model_AclTest::testHasUsername
Use of undefined constant parent - assumed 'parent'

/mnt/dev/mragent/application/models/Acl.php:14
/mnt/dev/mragent/tests/application/models/AclTest.php:18

Так что что-то действительно не так, я думаю. Или я делаю что-то действительно неправильно.

Как правильно настроить мои пути?

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Первое, что вы захотите посмотреть на следующую строку:

class Model_Acl extends Zend_Acl

Это причина, по которой вам нужно следующее:

require_once ('Zend/Acl.php'); // gives error w/o

Чтобы получитьчтобы все работало без добавления строки выше, вам нужно настроить пути включения, чтобы автозагрузчик мог найти файл Acl.php, который находится непосредственно в каталоге 'Zend'.Вы включаете путь, просто нужно включить каталог, который является родителем каталога 'Zend'.Обычно это будет ваша «библиотечная» директория.

Что касается «родительской» проблемы:

Use of undefined constant parent - assumed 'parent'

Вы видите это, потому что у вас есть следующий код:

if (method_exists(parent, '__construct')) parent::__construct();

Что на самом деле должно быть:

if (method_exists(get_parent_class($this), '__construct')) parent::__construct();

В качестве альтернативы вы можете написать следующее:

method_exists(get_parent_class($this), '__construct') && parent::__construct();

Это немного более кратко (столько, сколько можно получить с помощью PHP)и чуть меньше шума.

Причина этого?

Самая первая вещь в строке (крайний левый) - это "method_exists", который является быстрым индикатором того, что это то, что нас волнуетоколо.Самый конец строки (крайний левый, кроме точки с запятой) является конечным результатом.Кроме того, && в целом является хорошим индикатором того, что после него должен быть только один оператор.Если это изменится, легко увидеть, что весь оператор, скорее всего, необходимо пересмотреть, а не присоединять другой оператор после parent :: __ construct ();

EDIT: дополнительная информация о автозагрузке:

создайте файл autoload.php.dist в корне вашего проекта (замените '/ PATH / TO / YOUR / PHP5 / LIB / DIR'):

<?php /* autoload.php.dist */

$includePaths = array( realpath('/PATH/TO/YOUR/PHP5/LIB/DIR'), get_include_path());
set_include_path( join(\PATH_SEPARATOR, $includePaths) );

spl_autoload_register(function($className) {
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require $fileName;
}, true, true);

Создайте загрузчик, который можно использовать повторно(bootstrap.php)

<?php /* bootstrap.php */
if (file_exists($file = __DIR__.'/autoload.php')) {
    require_once $file;
} elseif (file_exists($file = __DIR__.'/autoload.php.dist')) {
    require_once $file;
}

Создайте файл phpunit.xml.dist, который использует ваш bootstrap.php (замените './your/test/directory/here'):

<?xml version="1.0" encoding="UTF-8"?>
<!-- phpunit.xml.dist -->
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="./bootstrap.php"
>
    <testsuites>
        <testsuite name="Test Suite">
            <directory>./your/test/directory/here</directory>
        </testsuite>
    </testsuites>
</phpunit>

Теперь вы можете запустить phpunit из корневого каталога проекта.

1 голос
/ 26 января 2011

Вы должны использовать автозагрузчик, чтобы превратить имя класса Zend_Acl в путь к файлу Zend / Acl.php.Это должно быть в вашем файле PHPUnit bootstrap.php.Zend Framework предоставляет простой в использовании автозагрузчик.

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

"Пространства имен" Zend и ZendX регистрируются автоматически.Если вы хотите зарегистрировать свое собственное «пространство имен», используйте это:

$loader->registerNamespace('MyNamespace_');

Вы, конечно, можете использовать свою собственную функцию автозагрузки, но если вы уже используете Zend Framework, это кажется хорошимroute.

Кстати, кавычки вокруг «пространства имен» означают, что это не настоящие пространства имен PHP, а соглашения об именах классов, которые превращают части между подчеркиваниями в имена каталогов.

0 голосов
/ 03 февраля 2011

Я просто публикую это, чтобы другие нашли ответ:

Мне пришлось обновить до PHPunit 3.4.PHPunit 3.2 игнорирует файл начальной загрузки, указанный в файле xml.Возможно, эта функция не была реализована в то время.После этого все работает как положено, и мне не нужно требовать любых файлов из моего проекта или пути php после загрузки Zend_Application.

...