2011-10-04 85 views
5

我通過命令行運行我的單元測試,它工作正常。如何在PHP中單元測試會話變量?

但這裏的問題是,當我測試包含讀會話變量代碼的函數,我得到一個null值..

我的猜測是,你不能訪問會話變量時,你是不是在瀏覽器中。 。

我該怎麼用PHP做這件事? 這可能嗎?

通過使用笨1.7.2 IM的方式CIUnit v0.17

任何建議或評論將是對我很大的幫助..

感謝

+0

我會將會話數據訪問包裝在一個專門的類中,並在測試中模擬。 – Phil

+0

CI會話是事實上的餅乾,所以是的,他們在瀏覽器中工作 –

+0

感謝Phil和Damien的回覆.. @Phil我該怎麼做?所以對不起我完全noob這個..我可以問一個例子或程序,如果它可以與你.. thx –

回答

8

我使用一個類的菲爾建議的會議。如果手動調用session_start(),則會將代碼綁定到PHP會話實現。我要在session_start調用是由我的會話類以下的保護:

if (!isset($_SESSION)) 
    { 
    // If we are run from the command line interface then we do not care 
    // about headers sent using the session_start. 
    if (PHP_SAPI === 'cli') 
    { 
     $_SESSION = array(); 
    } 
    elseif (!headers_sent()) 
    { 
     if (!session_start()) 
     { 
      throw new Exception(__METHOD__ . 'session_start failed.'); 
     } 
    } 
    else 
    { 
     throw new Exception(
      __METHOD__ . 'Session started after headers sent.'); 
    } 
    } 

編輯:

上面的代碼將進入您的會話類(也可能是被它的構造以某種方式調用)。命令行PHP創建一個數組而不是調用session_start(這在命令行上不起作用)。

當測試代碼依賴於會話變量我嘲笑會話變量在我的測試:

$_SESSION = array('key1' => 'value you want', 'key2' => 'etc.'); 

這允許您測試您將收到頁面上的所有可能的會話設置。

測試會話值是否創建屬於創建它們的代碼,因此嘲笑它們的存在對我來說似乎沒問題。通過這種方式,您可以單獨測試每個單元,而不是將它們組合起來,並在測試之間保持會話值。

+0

感謝保羅的答覆。這是否意味着我會自己創建會話課程?我如何訪問已經存在的會話變量?因爲Im在命令行中獲得空值,但在瀏覽器中獲取正確的值。我的單元測試是通過命令行運行的。 –

+0

我會用這些細節填寫我的答案。 – Paul

+0

非常... –