2011-10-03 77 views
3

我無法單元測試我的代碼。

$ _SESSION每次運行下一個測試時都會清除。 當我運行testStartProductSession()時,我的對象將一些數據添加到$ _SESSION變量中。但是當我運行下一個測試方法(testSessionIdIsKept())時,$ _SESSION又是空的。

看起來$ _SESSION在單元測試時變成局部變量。

我不知道還能做些什麼。請檢查輸出波紋管:

// session_start() on bootrap.php; 

class MC_Session_ProductTest extends PHPUnit_Framework_TestCase 
{ 

    /** 
    * @return MC_Session_Product 
    */ 
    public function getObject() 
    { 
     // make getInstance() return new instance instead of singleton instance 
     MC_Session_Product::$isUnityTest = true; 
     $object = MC_Session_Product::getInstance(); 
     $object->getWsClient()->setServerListUrl(SERVER_LIST_URL); 
     return $object; 
    } 

    /** 
    * All tests pass 
    * @depends testSetParam 
    */ 
    public function testStartProductSession() 
    { 
     $developerId = PARAM_DEVELOPER_ID; 
     $productCode = PARAM_PRODUCT_CODE; 
     $productVersion = PARAM_PRODUCT_VERSION; 
     $platform = PARAM_PLATAFORM; 
     $deviceType = PARAM_DEVICE_TYPE; 
     $locale = PARAM_LOCALE; 

     try { 
      $object = $this->getObject(); 
      $object->startSession($developerId, $productCode, $productVersion, 
            $platform, $deviceType, $locale); 
      $this->assertTrue($object->sessionStarted()); 
     } catch (Exception $e) { 
      $this->fail('Fail to start session: ' . $object->getLastUrl()); 
     } 

     echo "\$_SESSION in testStartProductSession(): ", print_r($_SESSION, 1); 
     return $object; 
    } 

    /** 
    * Test fails because $_SESSION is empty again 
    * @depends testStartProductSession 
    */ 
    public function testSessionIdIsKept(MC_Session_Product $lastObject) 
    { 
     echo "\$_SESSION in testSessionIdIsKept(): ", print_r($_SESSION, 1); 
     $object = $this->getObject(); 
     // fails 
     $this->assertTrue($lastObject->sessionStarted()); 
     $this->assertTrue($object->sessionStarted()); 
     $this->assertEquals($lastObject->getSessionId(), $object->getSessionId()); 
     return $object; 
    } 
} 

/* ###### Output 


$_SESSION in testStartProductSession(): 
Array 
(
    [__MC] => Array 
     (
      [MC_Session_Product] => Array 
       (
        [keyOne] => 'valueOne' 
        [sessionId] => 'someId' 
       ) 

     ) 

) 
$_SESSION in testSessionIdIsKept(): 
Array 
(
) 

*/ 

回答

0

PHPUnit將所有全局變量(包括$_SESSION)重置爲每個測試方法之前的初始值。通過將$backupGlobals實例屬性覆蓋爲false,可以禁用此功能以用於測試用例。這從setUp()方法不起作用。

class MyTest extends PHPUnit_Framework_TestCase 
{ 
    protected $backupGlobals = FALSE; 

    // ... 
} 

查看Global Variables and PHPUnit瞭解更多詳情。

+0

Kudos!像魅力一樣工作。非常感謝你! – Marcelo

0

我會假設在每次測試之前都會調用一個方法。你可以在那裏設置cookie。在java中,你有註解@Before。

+0

在PHPUnit中,您創建了一個名爲'setUp()'的方法 - 與JUnit中的非註釋方式相同。 –

2

而不是使$ _SESSION成爲您的單元測試的依賴項,您應該參數化每個函數所需的會話部分。然後您可以輕鬆地模擬單元測試中的參數。以目前的方式來做這件事太困難了,並且使得你的代碼不易測試。這將需要更改當前的代碼,但它會改進您的代碼並使其更具可測試性。

+0

那麼,這是我嘗試單元測試的第一個項目。我不知道如何用模擬**對象替換$ _SESSION(一個數組)。我不能參考。你有沒有實現這個目標的代碼示例?非常感謝您的幫助。 – Marcelo