Использование констант в пространствах имен - PullRequest
0 голосов
/ 17 октября 2011

Я работаю с пространствами имен и PHP 5.3 в моем фреймворковом проекте.У меня есть основной App класс и Autoloader класс.В классе App я настроил несколько переменных окружения:

public static function setupEnv()
        {
            $os = 'UNIX';
            if (stristr(PHP_OS,'WIN'))
            {
                $os = 'WIN';
            }

            if (!defined('DIRECTORY_SEPARATOR'))
            {
                define('DIRECTORY_SEPARATOR',($os == 'UNIX') ? '/' : '\\');

            }
            define('DS', \DIRECTORY_SEPARATOR);

            if (!defined('PATH_SEPARATOR'))
            {
                define('PATH_SEPARATOR', ($os == 'UNIX') ? ':' : ';');
            }
            define('PS', \PATH_SEPARATOR);

            if (!defined('APP_PATH'))
            {
                define('APP_PATH', dirname(dirname(__FILE__)));
                define('AP', APP_PATH);
            }
        }

Константы определены правильно, как DIRECTORY_SEPARATOR, так и DS, и если я их здесь повторю, они будут работать отлично.Пространство имен для этого - Feather \ App.В классе Autoloader я использую константу DS, и она отлично работает.Класс Autoloader находится в том же пространстве имен Feather \ App.

Я запускаю PHPUnit и создал этот тест - setupEnv() вызывается в функции setUp() PHPUnit:

public function testAutoloadFunction()
    {
        $this->assertEquals(
            dirname(dirname(__FILE__)) . DS.'Components'.DS.'Collections'.DS.'Collection.php',
            \Feather\App\Autoloader::Autoload('\\Feather\\Components\\Collections\\Collection')
        );
    }

Это не пройдёт проверку, даже если путь вернётся правильно.Там написано:

Use of undefined constant DS - assumed 'DS'

Итак, у меня много предыстории, чтобы ответить на мой вопрос - почему это ошибка?Я подумал, хорошо, может быть, мне нужно сослаться на \ Feather \ App \ DS, но это выдает следующее:

PHP Fatal error: Undefined constant 'Feather\App\DS' in /web/Feather/Tests/AutoloaderTest.php

Я думал, что константы были определены в глобальной области видимости, поэтому не стоитэто работа?Если нет, то как мне сделать так, чтобы PHPUnit был счастлив?Если я поставлю use Feather\App вверху, он все равно потерпит неудачу с той же самой ошибкой assumed 'DS'.

Может кто-нибудь объяснить это?До сих пор документация PHP была бесполезной!

1 Ответ

0 голосов
/ 04 марта 2012

У меня была очень похожая проблема, и я запустил тесты со следующими шагами:

1) Маркировка испытаний с пометкой @runInSeparateProcess

2) Переопределение run() в тестовом классе примерно так:

public function run(PHPUnit_Framework_TestResult $result = NULL) {
    $this->setPreserveGlobalState(false);
    return parent::run($result);
}

3) Помещение require_once(), которое вызывает определение константы в файле теста, в setUp():

public function setUp() {
    require_once __DIR__.'/SetUpEnv.php';
}

Возможно, это не идеальный обходной путь, но он, без сомнения, лучше, чем вообще никакого обходного пути.

Я собрал фрагменты (или, может быть, все) из других ответов на StackOverflow и / или где-то еще, но это было какое-то время, поэтому извиняюсь перед источниками, которые я здесь не цитирую.

В любом случае, надеюсь, это поможет!

...