2010-06-16 10 views
9

PHPUnit के साथ कच्चे PHP कोड का परीक्षण करना काफी आसान है, लेकिन कोड के बारे में क्या है जो कुकीज़ पर भारी निर्भर करता है? सत्र एक अच्छा उदाहरण हो सकता है।कुकीज़ और सत्रों का परीक्षण करने के लिए PHPUnit का उपयोग करके, कैसे?

क्या कोई ऐसी विधि है जिसके लिए मुझे मेरे परीक्षण के दौरान डेटा के साथ $_COOKIE सेट करने की आवश्यकता नहीं है? यह चीजों को करने का एक हैकी तरीका लगता है।

+0

क्या आप हैकी पर विस्तार कर सकते हैं? क्या आप परीक्षण के 'सेटअप' में बस 'अनसेट ($ _ कुकी)' कर सकते हैं? –

+0

मैं वास्तव में अपने परीक्षणों में उससे निपटना नहीं चाहता हूं। मुझे लगता है कि यह अनावश्यक अव्यवस्था है और इसे स्वचालित रूप से निपटाया जाना चाहिए। –

उत्तर

5

यह कोड, विशेष रूप से लापरवाही PHP कोड के साथ एक आम समस्या है। उपयोग की जाने वाली आम तकनीक संबंधित वस्तुओं में कुकी/सत्र संस्करणों को आगे बढ़ाने और उन निर्भरताओं को दायरे में खींचने के लिए नियंत्रण तकनीक (ओं) का उलटा उपयोग करना है।

http://martinfowler.com/articles/injection.html

अब इससे पहले कि आप एक परीक्षण को अंजाम आप एक कुकी/सत्र वस्तु की एक नकली संस्करण का दृष्टांत और डिफ़ॉल्ट डेटा प्रदान करेंगी।

मुझे कल्पना है, परीक्षण को निष्पादित करने से पहले सुपर ग्लोबल वैल्यू को ओवरराइड करके विरासत कोड के साथ एक ही प्रभाव प्राप्त किया जा सकता है।

चीयर्स, एलेक्स

2

मैं समझता हूँ कि यह काफी पुराना है, लेकिन मेरा मानना ​​है कि इस के रूप में प्रौद्योगिकी मूल पोस्ट के बाद से सुधार हुआ है अद्यतन करने की जरूरत है। मैं PHPUnit 3.7 के साथ php 5.4 का उपयोग कर इस समाधान के साथ काम कर रहे सत्र प्राप्त करने में सक्षम था:

class UserTest extends \PHPUnit_Framework_TestCase { 
    //.... 
    public function __construct() { 
     ob_start(); 
    } 

    protected function setUp() { 
     $this->object = new \User(); 
    } 

    public function testUserLogin() { 
     $this->object->setUsername('test'); 
     $this->object->setPassword('testpw'); 
     // sets the session within: 
     $this->assertEquals(true, $this->object->login()); 
    } 
} 
+1

आगे की जांच ने मुझे (मेरे दिमाग में) एक एनोटेशन के रूप में आउटपुट बफरिंग के सही कार्यान्वयन के लिए प्रेरित किया है: @outputBuffering सक्षम इसे फ़ंक्शन पर टिप्पणियों में रखें और यह बफरिंग समस्या का ख्याल रखता है। – Etrahkad

0

मैंने पाया कि मैं PHPUnit इस्तेमाल कर सकते हैं मेरी वेबसाइट का हिस्सा है कि एक संयोजन के माध्यम से सत्र पर काफी निर्भर करता, के व्यवहार का परीक्षण करने के कर्ल और कुकी जो सत्र आईडी पास करता है।

निम्नलिखित Curl कक्षा सत्र पैरामीटर पास करने के लिए CURLOPT_COOKIE विकल्प का उपयोग करती है। स्थिर चर $sessionid विभिन्न कर्ल कॉल के बीच सत्र बचाता है। इसके अलावा, स्थिर फ़ंक्शन changeSession का उपयोग करके सत्र बदला जा सकता है।

class Curl { 
    private $ch; 
    private static $sessionid; 

    public function __construct($url, $options) { 
     $this->ch = curl_init($url); 

     if (!self::$sessionid) 
      self::$sessionid = .. generateRandomString() ..; 

     $options = $options + array(
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_COOKIE => 'PHPSESSID=' . self::$sessionid); 

     foreach ($options as $key => $val) { 
      curl_setopt($this->ch, $key, $val); 
     } 
    } 

    public function getResponse() { 
     if ($this->response) { 
      return $this->response; 
     } 

     $response = curl_exec($this->ch); 
     $error = curl_error($this->ch); 
     $errno = curl_errno($this->ch); 
     $header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE); 
     $this->header = substr($response, 0, $header_size); 
     $response = substr($response, $header_size); 

     if (is_resource($this->ch)) { 
      curl_close($this->ch); 
     } 

     if (0 !== $errno) { 
      throw new \RuntimeException($error, $errno); 
     } 

     return $this->response = $response; 
    } 

    public function __toString() { 
     return $this->getResponse(); 
    } 

    public static function changeSession() { 
     self::$SESSIONID = Practicalia::generateRandomString(); 
    } 
} 

एक उदाहरण कॉल

$data = array(
    'action' => 'someaction', 
    'info' => 'someinfo' 
); 

$curl = new Curl(
    'http://localhost/somephp.php', 
    array(
     CURLOPT_POSTFIELDS => http_build_query($data))); 

$response = $curl->getResponse(); 

और बाद में किसी भी कर्ल कॉल अपने आप जब तक कि विशेष Curl::changeSession() कहा जाता है, पिछले एक के रूप में एक ही सत्र का प्रयोग करेंगे।

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

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