Uczę się i odkrywam aplikacje PHPUnit z PHP 5.2.9 i mam problem z globalizacją. Ustawiłem $ backupGlobals na FALSE, włączając dokument "@backupGlobals wyłączony" i to nie wpływa na zachowanie tworzenia kopii globalnych przez PHPUnit. Czy jest coś, czego mi brakuje? Czy muszę zmienić plik xml PHPUnit? Utworzyć bootstrap?PHPUnit i Globals
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() nie powiedzie się na $ this-> assertNotEmpty ($ this -> testClass-> test), wskazując, że $ this-> backupGlobals jest ustawione na FALSE i że globale nadal są tworzone przez PHPUnit.
EDIT: mam tej pracy poprzez następujące changes-
BasicAppTest.php:
protected $backupGlobals = FALSE; <- REMOVED
protected $backupGlobalsBlacklist = array('testString'); <- REMOVED
config.php:
global $testString; <- ADDED
$testString = 'Hello world!';
Jestem oszołomiony, że nie ma gdzieś się gdzieś podziały!
Czy linia 'global $ testString;' potrzebne? Rozumiem, że słowo kluczowe "global" w zasięgu globalnym nie ma żadnego efektu, ponieważ jesteś już w zasięgu globalnym. –
@DavidHarkness Nie masz możliwości dowiedzenia się, kiedy piszesz kod, niezależnie od tego, czy jesteś w zasięgu globalnym czy nie. Tylko dlatego, że znajdujesz się w głównym zakresie pliku, a nie wewnątrz funkcji, nie oznacza to, że będziesz znajdować się w zasięgu globalnym w czasie wykonywania.Jeśli ten plik jest 'include'd wewnątrz funkcji, faktycznie będziesz w zasięgu tej funkcji, nawet w głównym zakresie pliku. Z tego powodu ogólnie uważa się za najlepszą praktykę, aby zawsze zadeklarować zmienną, która ma być globalna jako taka ze słowem kluczowym "global". W ten sposób wiesz, że będzie globalna bez względu na wszystko. –