2011-06-02 21 views
2

我正在嘗試在我的測試中使用Zend_Test_PHPUnit_ControllerTestCase,並遇到困難。測試單實例會話的Zend控制器

我的應用程序引導程序實例化一個庫類,它管理對一個名爲'LiveData'的Zend_Session_Namespace的訪問。 LiveData爲當前用戶,當前Organsation等維護數據數組。一旦實例化,LiveData對象就存儲在註冊表中。

當我實例化LiveData時,我設置了singleInstance = true,即。 new Zend_Session_Namespace('LiveData', true)這是爲了減少關於誰對LiveData做什麼的潛在困惑。

無論如何,這似乎工作正常。我瀏覽網站,登錄,註銷等,我的會話數據表現得如我所願。

但是,當試圖測試時,我收到一條消息,提示「會話命名空間對象已經存在於這個命名空間中」。

我的測試是在每個測試文件自舉如下:

public function setUp() 
{ 
    $this->bootstrap = new Zend_Application(APPLICATION_ENV, 
      APPLICATION_PATH . '/configs/application.ini'); 
    parent::setUp(); 
} 

這是由Netbeans的放在那裏默認的腳手架。閱讀Zend_Test文檔,這對我來說似乎很好。

這個問題似乎出現時,我派遣一個測試控制器,如下:

public function testIndexIsDefaultAction() 
{ 
    $this->dispatch('/'); 

    // assertions 
    $this->assertController('Index'); 
    $this->assertAction('index'); 
} 

我認爲測試的設置()方法導致我的應用程序引導運行(和創建的副本LiveData)。然後$this->dispatch('/')再次運行靴子......但我無法想象爲什麼會這樣。 (爲什麼我們希望它運行兩次?)如果你能闡明我的困境,我會非常感激!

回答

1

setUp()方法只告訴Zend如何調用您的bootstrap,這是在您致電dispatch()時完成的。但是,您的引導程序將以測試方法運行。既然你告訴Zend阻止Zend_Session_Namespace多個實例具有相同的命名空間,那麼第二個測試方法將失敗。

查看Zend_Session_Namespace的來源以重置標誌。如果存在,請在調用應用程序引導程序之前將其添加到測試引導程序中。

+0

謝謝大衛。你是對的。現在我已經移除了該標誌,並將其放在待辦事項列表中。這給我提出了關於Zend和PHPUnit的「操作理論」的更大問題。我會嘗試把它帶入另一個SO問題。 – 2011-06-03 06:06:54

+1

是的,每個測試方法都被視爲一個新的請求,就像它從'index.php'進入前端控制器一樣。您需要確保您在引導程序中執行的任何操作都可以被清除,或者不會阻止第二次調用成功。 – 2011-06-03 06:16:22

+0

這對了解Zend和PHPUnit的交互方式仍然沒有100%清晰。我可以理解PHPUnit堅持自己的狀態,或者它測試的應用程序的狀態。對我來說,被測系統不會在測試方法之間持續存在狀態(就像它不會在通過index.php進行的調用之間持續存在,除非它故意保留在Zend_Session等對象中一樣)。 – 2011-06-04 01:22:27