2011-10-04 43 views
3

我有簡單的會話包裝類與getter和setter來處理OO風格的$ _SESSION。在__constructor()中調用session_start()。單元測試此課程的最佳做法是什麼?如何單元測試會話包裝類?

  1. 正如我們從CLI運行單元測試 - 我們不能真正創建會話,但我們可以在測試設置或測試任何其他地方定義$ _SESSION變量。模擬網絡會話的最佳做法是什麼?也許我應該創建一種測試環境,並設置所有服務器變量?

  2. PHPUnit_Framework_Error_Warning:E_WARNING:在session_start():不能發送會話cookie - 頭已經發出(輸出開始在C:\用戶\珥\應用程序數據\本地的\ Temp \ phpunit_go_Kir.php:770) - 如何避免這種情況?如何防止PHP單元測試輸出Testing started at 12:59 ...

PS:對不起,我的問題,但我已經開始編寫單元測試昨天才和我此刻沒有足夠的經驗。

謝謝。

回答

0

在您的代碼中調用session_start會將您綁定到PHP的session_start實現。實際上,會話的思路在CLI中沒有多大意義。你可以在你的類下面的代碼保護您的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.'); 
    } 
    } 

我遵守了我的會話類,只是這段代碼(加上session_id的一個簡單的顯示功能)。在CLI中進行測試可以繼續,因爲session_start調用已被防範。實際上測試我粘貼的代碼很難。您可以在正常CLI測試以外的瀏覽器下通過觀察來測試它。至少所有其他的CLI測試現在都不受session_start調用的影響。