PHPUnit и глобальные - PullRequest
       22

PHPUnit и глобальные

9 голосов
/ 12 марта 2012

Я изучаю и изучаю приложения PHPUnit с PHP 5.2.9 и столкнулся с проблемой глобальных проблем.Я установил для $ backupGlobals значение FALSE, включил документ '@backupGlobals disabled', и это, похоже, не влияет на поведение резервного копирования глобальных переменных в PHPUnit.Я что-то упускаю?Нужно ли изменять XML-файл PHPUnit?Создать загрузчик?

config.php:

$testString = 'Hello world!';

basicApp.php:

require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\config.php');

class BasicApp {

public $test;

public function __construct() {
    global $testString;
    $this->test = $testString;
}

public function getTest() {
    return $this->test;
}

public function setTest($test){
    $this->test = $test;
}

BasicAppTest.php:

require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\BasicApp.php');

class BasicAppTest extends PHPUnit_Framework_TestCase{
    protected $testClass;
    protected $backupGlobals = FALSE;
    protected $backupGlobalsBlacklist = array('testString');

    public function SetUp(){
        $this->testClass = new BasicApp;
        $this->testClass->bootstrap();
    }

    public function testGlobal(){
        echo $this->testClass->getTest();
        $this->assertNotNull($this->backupGlobals);
        $this->assertFalse($this->backupGlobals);
        $this->assertNotEmpty($this->testClass->test);
    }

    public function testMethods(){
        $this->testClass->setTest('Goodbye World!');
        echo $this->testClass->getTest();
        $this->assertNotNull($this->backupGlobals);
        $this->assertNotNull($this->testClass->test);
        if (empty($this->testClass->test)) echo 'Method set failed!';
    }
}

testGlobal() завершается с ошибкой в ​​$ this-> assertNotEmpty ($ this-> testClass-> test), указывая, что для $ this-> backupGlobals задано значение FALSE и что глобальные резервные копии по-прежнему сохраняются в PHPUnit.

EDIT:Я получил эту работу, внеся следующие изменения:

BasicAppTest.php:

    protected $backupGlobals = FALSE; <- REMOVED
    protected $backupGlobalsBlacklist = array('testString');  <- REMOVED

config.php:

global $testString; <- ADDED
$testString = 'Hello world!';

Я удивлен, что этого не произошлобыл где-то покрыт!

Ответы [ 2 ]

10 голосов
/ 13 марта 2012

В вашем тестовом примере вы определяете новое $backupGlobals свойство, которое PHPUnit не увидит.Поскольку свойство защищено, вы можете установить его в конструкторе false, но PHPUnit использует его конструкторы для передачи информации о том, как запустить метод теста.Вместо этого создайте файл конфигурации phpunit.xml , чтобы установить для свойства backupGlobals значение false.

<phpunit backupGlobals="false">
    <testsuites>
        <testsuite name="Test">
            <directory>.</directory>
        </testsuite>
    </testsuites>
</phpunit>
.
2 голосов
/ 10 мая 2014

В ваших изменениях и комментариях вы указали один обходной путь для этой проблемы (явно объявив глобальные переменные в тестируемом приложении). В комментарии onlab к проблеме PHPUnit он объясняет поведение: при включении файла в функцию PHP помещает глобальные переменные из включенных файлов в область действия функции. PHPUnit загружает файлы в функцию, и, хотя он пытается извлечь глобальные переменные, он не работает в тех случаях, которые я пробовал.

К сожалению, я не смог воспроизвести проблемы моей прежней системы в минимальных тестовых случаях (и у меня были проблемы с пониманием вашей), и поэтому я не могу действительно подтвердить объяснение. Но его предложенный обходной путь помог мне: предоставить файл начальной загрузки, используя опцию --bootstrap; в нем объявите все глобальные объекты, используемые протестированными частями вашего приложения. Это позволяет избежать необходимости изменять приложение для его тестирования. Вот пример онлаба из GitHub:

phpunit --bootstrap bootstrap.php test-path

с bootstrap.php:

global $my, $system, $globals, $here;
require_once("/path/to/my/system/bootstrap.php");
...