2012-02-21 8 views
7

मैं फ़िनपिट के साथ ज़ेंड फ्रेमवर्क पर शॉपिंग कार्ट, चेकआउट, भुगतान प्रक्रिया का परीक्षण करने पर काम कर रहा हूं। मैं कार्ट में उत्पादों को जोड़कर ShoppingCartController का परीक्षण कर रहा हूं, ShoppingCart मॉडल जेड सत्र नामस्थान में उत्पाद आईडी को संग्रहीत करके उत्पाद जोड़ों को संभालता है, और फिर एक और परीक्षण में मैं परीक्षण करना चाहता हूं कि उत्पादों को जोड़ा गया हो। वही ShoppingCart मॉडल उसी ज़ेंड सत्र नामस्थान चर से जोड़े गए उत्पादों की एक सूची पुनर्प्राप्त करता है।phpunit पर सभी परीक्षणों के माध्यम से सत्र कैसे संरक्षित करें?

ऐड उत्पाद परीक्षण इस तरह दिखता है और अच्छी तरह से काम करता है, और var_dump($_SESSION) डिबग को जोड़ा गया है और सही ढंग से उत्पादों पता चलता है: मॉडल पूछ ऐसा करने के लिए से उत्पादों को पुनः प्राप्त करने

public function testCanAddProductsToShoppingCart() { 

    $testProducts = array(
     array(
      "product_id" => "1", 
      "product_quantity" => "5" 
     ), 
     array(
      "product_id" => "1", 
      "product_quantity" => "3" 
     ), 
     array(
      "product_id" => "2", 
      "product_quantity" => "1" 
     ) 
    ); 

    Ecommerce_Model_Shoppingcart::clean(); 

    foreach ($testProducts as $product) { 
     $this->request->setMethod('POST') 
       ->setPost(array(
        'product_id' => $product["product_id"], 
        'quantity' => $product["product_quantity"] 
       )); 

     $this->dispatch($this->getRouteUrl("add_to_shopping_cart")); 
     $this->assertResponseCode('200'); 
    } 

    $products = Ecommerce_Model_Shoppingcart::getData(); 
    $this->assertTrue($products[2][0]["product"] instanceof Ecommerce_Model_Product); 
    $this->assertEquals($products[2][0]["quantity"], 
      "8"); 

    $this->assertTrue($products[2][1]["product"] instanceof Ecommerce_Model_Product); 
    $this->assertEquals($products[2][1]["quantity"], 
      "1"); 

    var_dump($_SESSION); 
} 

दूसरे टेस्ट के प्रयास , var_dump($_SESSION) पहले से ही परीक्षण की शुरुआत में शून्य है। सत्र चर रीसेट किए गए थे, मैं उन्हें संरक्षित करने का कोई तरीका ढूंढना चाहता हूं, क्या कोई मदद कर सकता है?

public function testCanDisplayShoppingCartWidget() { 
    var_dump($_SESSION); 
    $this->dispatch($this->getRouteUrl("view_shopping_mini_cart")); 
    $this->assertResponseCode('200'); 
} 

उत्तर

6

आपको गलत दिशा में इंगित करने के लिए खेद है।

<?php 

# running from the cli doesn't set $_SESSION here on phpunit trunk 
if (!isset($_SESSION)) $_SESSION = array(); 

class FooTest extends PHPUnit_Framework_TestCase { 
    protected $backupGlobalsBlacklist = array('_SESSION'); 

    public function testOne() { 
     $_SESSION['foo'] = 'bar'; 
    } 

    public function testTwo() { 
     $this->assertEquals('bar', $_SESSION['foo']); 
    } 

} 

?> 

== अंत अद्यतन

  1. समारोह टियरडाउन में(): $ _SESSION कॉपी करने के लिए यहाँ इस को प्राप्त करने का a way better way है, irc.freenode.net की #phpunit चैनल से ashawley ने सुझाव दिया एक वर्ग विशेषता और
  2. समारोह सेटअप में(): $ _SESSION
के वर्ग विशेषता कॉपी

<?php 
# Usage: save this to test.php and run phpunit test.php  

# running from the cli doesn't set $_SESSION here on phpunit trunk                         
if (!isset($_SESSION)) $_SESSION = array(); 

class FooTest extends PHPUnit_Framework_TestCase { 
    public static $shared_session = array(); 

    public function setUp() { 
     $_SESSION = FooTest::$shared_session; 
    } 

    public function tearDown() { 

     FooTest::$shared_session = $_SESSION; 
    } 

    public function testOne() { 
     $_SESSION['foo'] = 'bar'; 
    } 

    public function testTwo() { 
     $this->assertEquals('bar', $_SESSION['foo']); 
    } 
} 

इसके अलावा वहाँ एक backupGlobals feature लेकिन यह मेरे लिए काम नहीं करता:

उदाहरण के लिए, इस परीक्षण जब आप कार्यों सेटअप() और टियरडाउन() पद्धतियों को दूर विफल रहता है। आपको इसे सोचना चाहिए, शायद यह स्थिर PHPUnit पर काम करता है।

+0

ठीक है, मैं इसे – Daniel

+0

का प्रयास करूंगा, धन्यवाद, यह बहुत उम्मीद है! – Daniel

+0

परीक्षण मामलों के बीच सत्र साझा करने के लिए आप क्या सुझाव देंगे ?? – Daniel

1

जो ऐसा करने का बहुत बदसूरत है। सही तरीका निर्भरता इंजेक्शन का उपयोग करना चाहिए।

संकेत मिलता है कि अपने स्रोत कोड को बदलने के सत्र के बजाय इस वर्ग के सीधे उपयोग करने के लिए:

class Session 
{ 
    private $adapter; 
    public static function init(SessionAdapter $adapter) 
    { 
    self::$adapter = $adapter; 
    } 
    public static function get($var) 
    { 
     return self::$adapter->get($var); 
    } 
    public static function set($var, $value) 
    { 
    return self::$adapter->set($var, $value); 
    } 
} 

interface SessionAdapter 
{ 
    public function get($var); 
    public function set($var, $value); 
} 

अतिरिक्त जानकारी:

0

आप भी कर सकते हैं बस एक यादृच्छिक सत्र आईडी बनाएँ अपने PHPUnit परीक्षण के लिए, और फिर सुनिश्चित करें कि आप इस सत्र आईडी को आपके द्वारा किए गए हर कॉल में कुकी में पास करते हैं। कर्ल के साथ, आप CURLOPT_COOKIE विकल्प का उपयोग और 'PHPSESSID=thesessionidofyourunittest' लिए यह इस तरह के रूप में स्थापित होगा:

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=thesessionidofyourunittest'); 

मैं विस्तार से और this stackoverflow answer में एक उदाहरण के साथ और अधिक विस्तार से बताया।

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