2009-10-31 15 views
10

के साथ पथ समस्याओं से निपटने के लिए मैंने अभी PHPUnit का उपयोग करना शुरू कर दिया है, लेकिन मैंने थोड़ा सा झटका लगाया है।PHPUnit

मेरे कोड $ _SERVER का उपयोग करता है [ 'DOCUMENT_ROOT'] पथ की गणना करने के लिए भी शामिल है, जो काम करता है जब मेरी अपाचे सर्वर एक PHP चल रहा है, लेकिन DOCUMENT_ROOT सेट नहीं है जब मैं "PHPUnit टेस्ट" के साथ कमांड लाइन से PHPUnit चलाने , इसलिए इनमें शामिल नहीं है।

क्या मुझे PHPUnit की कॉन्फ़िगरेशन में कुछ याद आ रही है? क्या इसे किसी भी तरह से अपाचे के साथ एकीकृत किया जाना चाहिए?

उत्तर

14

देर उत्तर, क्षमा करें।

नहीं, आप कुछ भी याद नहीं कर रहे हैं। PHP सीएलआई (कमांड लाइन के लिए PHP) एक अपाचे/सीजीआई मॉड्यूल के रूप में PHP की तुलना में एक अलग जानवर है।

तुम कर सकते हो क्या, हालांकि आपकी फ़ाइलों के setUp() बदल तुम क्या जरूरत के लिए $_SERVER['DOCUMENT_ROOT'] स्थापित करने के लिए, उदाहरण के लिए (के बाद से $_SERVER अभी भी एक superglobal भी CLI संदर्भ में के रूप में उपलब्ध है) है :

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

बस सावधान रहना होगा, तो आप शायद अपने tearDown() में डाल करना चाहते हैं:

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

PHPUnit backs up your global state यदि आप सब पर वैश्विक (भी superglobal) डेटा का उपयोग, जो आपके परीक्षण नीचे नाटकीय रूप से धीमा कर सकते हैं, इसलिए परीक्षण के बाद किसी भी होने से बचने के लिए बेहतर क्यों है।

0

सबसे अच्छा तरीका $_SERVER या किसी अन्य वैश्विक सरणी के उपयोग से आपके कोड को कम करने का सबसे अच्छा तरीका होगा।

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(); 

कृपया ध्यान रखें कि इस decoupling की सिर्फ एक सरल उदाहरण है हो की अनुमति देता है उदाहरण के लिए

class MyClass 
{ 
    protected $_docroot; 

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

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

के बजाय है। यह आपके मामले में अधिक जटिल हो सकता है - लेकिन आम तौर पर यह प्रयास के लायक है, खासकर यदि आप यूनिट परीक्षण चला रहे हैं।

+0

समस्या तब बन जाती है, मैं इस वर्ग को शामिल करने वाली फ़ाइल को कैसे शामिल करूं? –

+0

आह ठीक - मुझे समस्या दिखाई देती है ... मैंने आपके प्रश्न की वास्तविक पृष्ठभूमि को थोड़ा गलत समझा। आपको किसी भी पर्यावरण परिवर्तक ('$ _SERVER ['DOCUMENT_ROOT']') का उपयोग करके फ़ाइलों को शामिल करने पर भरोसा नहीं करना चाहिए। क्या यह संभव होगा कि आप सापेक्ष पथों का उपयोग करके अपनी फाइलें शामिल करें, उदा। 'requ_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 है। निर्देशिका जहां जेनकींस प्रोजेक्ट सोर्स कोड रखेगी /var/lib/jenkins/jobs/Test_Job/workspace है (जेनकिंस कार्य निर्देशिका को /var/lib/jenkins के रूप में मानते हुए)।

यदि बूटस्ट्रैप_टेस्ट।php मूल निर्देशिका में रखा गया है, BASE_PATH/var/lib/jenkins/jobs/Test_Job/workspace रखेगा और अंततः $_SERVER['DOCUMENT_ROOT'] पर सेट होगा।

0

बस के अंदर PHPUnit परीक्षण से दूसरे php फ़ाइलें (config.php) की तरह बुला दस्तावेज़ के लिए चाहते हैं।

class xyzTest extends TestCase { 

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

... 

config.php में मैं कुछ स्थिरांक की स्थापना की, फ़ाइल पथ की तरह:
मैं एक परीक्षण वर्ग की है। ये पथ $_SERVER['DOCUMENT_ROOT'] के सापेक्ष हैं।
मैं इन पथ स्थिरांक का उपयोग कर अपने xyz कक्षा का परीक्षण करना चाहता हूं।
हालांकि, कमांड लाइन से PHPUnit को कॉल करते समय, $_SERVER सुपरग्लोबल खाली है। मैंने answer above से अच्छी सलाह का पालन करने की कोशिश की और PHPUnits setUp विधियों में $_SERVER['DOCUMENT_ROOT'] सेट करें। इससे मेरी समस्या ठीक नहीं हुई।

मैं इतनी तरह मेरे Config.php में एक if बयान जोड़ने, द्वारा यह तय:

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

आशा इस किसी सिरदर्द बचाता है।

 संबंधित मुद्दे