2009-10-31 2 views
10

Я только начал использовать PHPUnit, но я столкнулся с некоторой проблемой.Работа с проблемами пути с PHPUnit

Мой код использует $ _SERVER ['DOCUMENT_ROOT'] для вычисления путей для включений, который работает, когда мой сервер Apache - это тот, на котором работает PHP, но DOCUMENT_ROOT не установлен, когда я запускаю phpunit из командной строки с помощью «phpunit Tests» , поэтому они не работают.

Я что-то упустил в конфигурации PHPUnit? Должно ли это быть каким-то образом интегрировано с apache?

ответ

14

Поздний ответ, извините.

Нет, вы ничего не пропустили. PHP CLI (PHP для командной строки) - это другой зверь, чем PHP, как модуль Apache/CGI.

Что вы можете сделать, хотя это изменить setUp() ваших файлов, чтобы установить $_SERVER['DOCUMENT_ROOT'] на то, что вам нужно (с $_SERVER по-прежнему доступен как суперглобальный даже в контексте CLI), например, :

public function setUp() { 
    $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../application"; 
} 

Только будьте осторожны, вы, вероятно, хотите, чтобы поместить это в ваш tearDown():

public function tearDown() { 
    unset($_SERVER['DOCUMENT_ROOT']); 
} 

PHPUnit backs up your global state если вы используете глобальные (также суперглобальные) данные на всех, которые могут замедлить ваши тесты вниз резко, следовательно, почему лучше избегать каких-либо действий после прохождения теста.

0

Лучшим способом было бы отделить ваш код от использования $_SERVER или любого другого глобального массива. Например сделать

class MyClass 
{ 
    protected $_docroot; 

    public function __construct($docroot) 
    { 
     $this->_docroot = $docroot; 
    } 

    public function getDocRoot() 
    { 
     return $this->_docroot; 
    } 
} 

вместо

class MyClass 
{ 
    public function getDocRoot() 
    { 
     return $_SERVER['DOCUMENT_ROOT']; 
    } 
} 

Это позволяет сделать

// in your actual code 
$instance = new MyClass($_SERVER['DOCUMENT_ROOT']); 
$docroot = $instance->getDocRoot(); 

// in your test 
$instance = new MyClass($variable_holding_the_correct_path); 
$docroot = $instance->getDocRoot(); 

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

+0

После этого возникает проблема, как включить файл, содержащий этот класс? –

+0

Ah OK - Я вижу проблему ... Я немного неправильно понял реальный фон вашего вопроса. Вы не должны полагаться на файлы, используя любую переменную среды (включая '$ _SERVER ['DOCUMENT_ROOT']'). Возможно ли, чтобы вы включили ваши файлы с использованием относительных путей, например. 'require_once dirname (__ FILE__). «/ MyClass.php''? С другой стороны, вы можете настроить какую-то автозагрузку ... –

1

$_SERVER['DOCUMENT_ROOT'] также может быть установлен в файле начальной загрузки и тот же Bootstrap_test.php прилагается к файлу конфигурации PHPUnit phpunit.xml с атрибутом имени bootstrap=Bootstrap_test.php

Я был в состоянии достигнуть требование установить $ _SERVER [ «DOCUMENT_ROOT»] для настройки работы Дженкинса. «Bootstrap_test.php» выглядит

<phpunit 

    backupGlobals="false" 

    backupStaticAttributes="false" 

    strict="true" 

    verbose="true" 

    bootstrap="Bootstrap_test.php"> 

    <testsuites> 

    <testsuite name="PHPUnit Test Suite"> 

    <file>PHPUnitTest.php</file> 

    </testsuite> 

    </testsuites> 

    <logging> 

    <log type="coverage-clover" target="logs/clover.xml"/> 

    </logging> 

</phpunit> 

и содержание в Bootstrap.php объявляется с помощью define() функции:

define('BASE_PATH', realpath(dirname(__FILE__)));  
$_SERVER['DOCUMENT_ROOT'] = BASE_PATH; 

переменная BASE_PATH обычно держать полный путь к каталогу заданий Дженкинс. Скажем, имя Дженкинса - Test_Job. Каталог, в котором Jenkins разместит исходный код проекта, - /var/lib/jenkins/jobs/Test_Job/workspace (предполагается, что рабочий каталог jenkins - /var/lib/jenkins).

If Bootstrap_test.php помещается в базовый каталог, BASE_PATH будет содержать /var/lib/jenkins/jobs/Test_Job/workspace и, наконец, установить на $_SERVER['DOCUMENT_ROOT'].

0

Просто хочу, чтобы документ вызывал другие php-файлы (например, config.php) из тестов PHPUnit.
У меня есть тестовый класс:

class xyzTest extends TestCase { 

    public static function setUpBeforeClass() { 
     require_once __DIR__ . '/../../app/config/Config.php'; 
    } 

... 

В config.php я поставил некоторые константы, как пути к файлам. Эти пути относятся к $_SERVER['DOCUMENT_ROOT'].
Я хочу проверить класс xyz, используя эти константы пути.
Однако, superglobal $_SERVER пуст при вызове PHPUnit из командной строки. Я пробовал следовать рекомендациям answer above и установить $_SERVER['DOCUMENT_ROOT'] в PHPUnits setUp методах. Это не повлияло на мою проблему.

Я установил ее, добавив if заявление в мой Config.php, например, так:

if ($_SERVER['DOCUMENT_ROOT']) { 
    $DocumentRoot = realpath($_SERVER['DOCUMENT_ROOT']); 
} else { 
    $DocumentRoot = realpath(dirname(__FILE__) . '/../..'); //for PHPUnit 
} 

Надеется, что это спасает кого-то болеет голову.

Смежные вопросы