2012-03-12 9 views
8

मैं PHP 5.2.9 के साथ PHPUnit के अनुप्रयोगों को सीख रहा हूं और खोज रहा हूं और ग्लोबल्स समस्या में भाग गया हूं। मैंने FALSE में $ बैकअपग्लोबल्स सेट किए हैं, जिसमें '@backupGlobals अक्षम' दस्तावेज़ शामिल है और यह ग्लोबल्स के PHPUnit के बैक अप के व्यवहार को प्रभावित नहीं करता है। क्या मुझे कुछ याद आ रही है? क्या मुझे PHPUnit की XML फ़ाइल को बदलने की आवश्यकता है? बूटस्ट्रैप बनाएं?PHPUnit और 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() $ this-> assertNotEmpty पर विफल रहता है (यह $ -> testClass-> परीक्षण), यह इंगित करता है कि $ यह-> बैकअपग्लोबल्स FALSE पर सेट है और वह ग्लोबल्स अभी भी PHPUnit द्वारा बैक अप ले रहे हैं।

संपादित करें: मैं निम्नलिखित बदलाव

BasicAppTest.php बनाकर इस काम कर रहे है:

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

config.php:

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

मैं चुप है कि इस नहीं है कर रहा हूँ कहीं से पहले कवर किया गया है!

+1

लाइन' वैश्विक $ testString है:

phpunit --bootstrap bootstrap.php test-path 

bootstrap.php साथ: यहाँ GitHub से onlab की मिसाल है? मेरी समझ यह है कि वैश्विक दायरे में 'वैश्विक' कीवर्ड का कोई प्रभाव नहीं पड़ता क्योंकि आप पहले से ही वैश्विक दायरे में हैं। –

+1

@ डेविड हार्केनेस आपके पास यह जानने का कोई तरीका नहीं है कि आप कोड लिख रहे हैं कि आप वैश्विक दायरे में हैं या नहीं। सिर्फ इसलिए कि आप फ़ाइल के मुख्य दायरे में हैं और फ़ंक्शन के अंदर नहीं, इसका मतलब यह नहीं है कि आप रनटाइम पर वैश्विक दायरे में होंगे।यदि उस फ़ाइल में फ़ंक्शन के भीतर 'शामिल' है, तो आप वास्तव में उस फ़ंक्शन के दायरे में होंगे, यहां तक ​​कि फ़ाइल के मुख्य दायरे में भी। इस कारण से इसे आम तौर पर 'वैरिएबल' कीवर्ड के साथ वैश्विक रूप से एक वैरिएबल घोषित करने का सर्वोत्तम अभ्यास माना जाता है। इस तरह आप जानते हैं कि यह वैश्विक होगा चाहे कोई फर्क नहीं पड़ता। –

उत्तर

10

अपने परीक्षण मामले में आप नई$backupGlobals संपत्ति को परिभाषित कर रहे हैं जो PHPUnit नहीं देखेगा। चूंकि संपत्ति संरक्षित है, इसलिए आप इसे निर्माता में false पर सेट कर सकते हैं, लेकिन PHPUnit परीक्षण विधि को चलाने के तरीके के बारे में जानकारी पास करने के लिए अपने रचनाकारों का उपयोग करता है। इसके बजाय, backupGlobals संपत्ति false पर सेट करने के लिए phpunit.xml configuration file बनाएं।

<phpunit backupGlobals="false"> 
    <testsuites> 
     <testsuite name="Test"> 
      <directory>.</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 
+0

आपको बहुत बहुत धन्यवाद। पिछले हफ्ते के लापता टुकड़े की तलाश में मैंने इसके खिलाफ अपने सिर को टक्कर लगी है। मैंने माना कि संरक्षित गुण उप-वर्गों द्वारा ओवर-लिखित हो सकते हैं! ठीक है, त्वरित अनुवर्ती: .xml फ़ाइल कहां जाती है? – Malovich

+0

मैंने इसे अपने 'परीक्षण' फ़ोल्डर की जड़ में रखा है, लेकिन यह कहीं भी जा सकता है। आप '--configuration' पैरामीटर का उपयोग करके 'phpunit' को इंगित कर सकते हैं (मुझे लगता है कि हाल ही में शॉर्टकट के रूप में' -c' जोड़ा गया था)। यदि यह वर्तमान निर्देशिका में है और 'phpunit.xml' नाम दिया गया है, तो PHPUnit इसे स्वचालित रूप से उठाएगा। –

+2

... किसी भी तरह, यह नेट फिसल गया। यदि आप PHPUnit के साथ वैश्विक चर का उपयोग करने जा रहे हैं, तो आपको वैश्विक स्थान में वैरिएबल ग्लोबल घोषित करने की आवश्यकता है (और इसे मान असाइन करें) और इसके समावेश को घोषित करें जहां इसकी स्थानीय आवश्यकता है। PHP के साथ डिफ़ॉल्ट व्यवहार यह है कि वैश्विक अंतरिक्ष में प्रारंभ किए गए चर वैश्विक बनाये गये हैं। PHPUnit इस डिफ़ॉल्ट को बदलता है! – Malovich

2

अपने संपादन और टिप्पणियां में आप समस्या के लिए एक वैकल्पिक हल बताया है (स्पष्ट रूप से परीक्षण किया आवेदन के भीतर वैश्विक घोषित)। onlab's comment to a PHPUnit issue में वह व्यवहार बताता है: जब किसी फ़ंक्शन में फ़ाइल शामिल होती है, तो PHP फ़ंक्शन के दायरे में शामिल फ़ाइलों से ग्लोबल्स डालता है। PHPUnit फ़ंक्शन में फ़ाइलों को लोड करता है, और हालांकि यह ग्लोबल्स निकालने का प्रयास करता है, लेकिन मैंने कोशिश किए गए मामलों में विफल रहता है।

दुर्भाग्य से, मैं कम से कम परीक्षण मामलों में मेरे पुराने सिस्टम की समस्याओं प्रजनन करने में सक्षम इसलिए मैं वास्तव में स्पष्टीकरण पुष्टि नहीं कर सकते नहीं किया गया है (और मैं मुसीबत तुम्हारा समझने था), और। लेकिन उनके सुझाए गए कामकाज ने मेरी मदद की: --bootstrap विकल्प का उपयोग कर बूटस्ट्रैप फ़ाइल की आपूर्ति करें; इसमें, अपने आवेदन के परीक्षण किए गए हिस्सों द्वारा उपयोग की जाने वाली हर वैश्विक घोषणा करें। यह परीक्षण करने के लिए एप्लिकेशन को संशोधित करने की आवश्यकता से बचाता है। `आवश्यकता थी;

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

दोनों लिंक में और आपकी कॉपी और पेस्ट में एक छोटा टाइपो है। इसे पढ़ना चाहिए: 'वैश्विक $ मेरा, $ सिस्टम, $ ग्लोबल्स, $ यहां;', यानी पीछे की ओर '। – Ognyan