2010-07-28 94 views
9

我有一個登錄後面的應用程序,它使用zend_acl和zend_auth。使用Zend Auth和Zend ACL進行PHP單元測試

在預調度期間,我有一個ACL插件,爲ACL創建所有規則。我還有一個Auth插件,用於檢查您是否登錄,如果有,您是否可以根據ACL訪問請求的資源。

由於應用程序完全是一個登錄,如果你在。

單元測試記錄,這似乎是不可能的,或者說更可能我失去了一些東西明顯ACL只落後創建。

在我的單元測試設置方法中,我模擬了一個成功的登錄,它返回一個zend_auth實例。通過測試表明此登錄成功。但是,如果我通過測試嘗試分派到另一個位置,或者評估登錄的用戶是否可以訪問給定的資源,它將始終被插件拒絕,因爲它們還沒有登錄。我不是當然,爲什麼這是,誰能提醒?

例如,這通過:

public function testLoggedIn() 
{ 
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity()); 
} 

這因爲它是由插件拒絕失敗:

public function testUserAccess() 
{ 

    $this->dispatch('/home'); 
      $this->assertResponseCode(200); 
      $this->assertQueryContentContains('#nav_side'); 
      $this->resetRequest() 
      ->resetResponse(); 

} 

這,我發現似乎仍然被重定向到登陸頁面插件不知道用戶是否已登錄。

任何幫助非常感謝。

回答

3

您所描述的問題在使用全局變量和OOP全局變量(Singleton模式)時發生了很多。

有出自PHPUnit的的作者描述瞭如何避免使用依賴注入,什麼其他的可能性,你已經有了和文章,因爲它是非常的描述,我建議你讀它:) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

作爲一個醜陋的選擇(如果你需要一個快速的結果),你可以創建一個Zend_Auth的存根(在鏈接中描述)並使用PHP 5.3反射API來爲你的存根設置Zend_Auth實例變量。

希望幫助(因爲這個問題住4H沒有其他的答案)

+0

是的 - 謝謝你,似乎是問題。 – 2010-07-28 16:12:07

2

下面是一個創建存根測試過程中替換的ACL插件(或任何插件)的另一種方式。把它放在ControllerTestCase中,並在測試用例setUp中調用它。

public function doLogin() 
{ 
    // create a fake identity 
    $identity = new stdClass(); 
    $identity->Username = 'PHPUnit'; 
    Zend_Auth::getInstance()->getStorage()->write($identity); 

    // remove the autoloaded plugin 
    $front = Zend_Controller_Front::getInstance(); 
    $front->unregisterPlugin('My_Controller_Plugin_Acl'); 

    // create the stub for the Acl class 
    $mockaAcl = $this->getMock(
     'My_Controller_Plugin_Acl', 
     array('preDispatch'), 
     array(), 
     'My_Controller_Plugin_AclMock' 
    ); 

    // register the stub acl plugin in its place 
    $front->registerPlugin($mockAcl); 
} 

這樣,您的stub preDispatch方法被調用,而這將會繞過您的實際訪問控制檢查。