2012-03-28 118 views
3

我一直在使用的PHPUnit有一段時間了,但突然懲戒LDAP連接打了一個大牆:嘲諷LDAP。我有一個小的抽象層用於使用默認的LDAP PHP擴展與LDAP服務器進行通信。現在,我不知道如何嘲笑擴展的連接和功能,以便正確測試我的課程。爲PHPUnit的測試套件

文件系統和數據庫嘲笑是相當常見的,易於安裝,但對於目錄服務器? :(

回答

5

你應該嘲笑你的LDAP適配器,而不是PHP擴展。文件系統和數據庫嘲笑相同的方式工作,他們不實際創建文件系統或數據庫,他們只是表示,通常以交互類彷彿這些數據來源和模仿的某些行爲也確實存在

例如:

// Load user 12345 
$user = UserModel::find(12345); 

通常情況下,這個調用會出去到數據庫和查詢用戶12345。然而,我們嘲笑PDO的適配器,並告訴它,當它query()或​​方法與數據迴應用期望的參數調用。所以,雖然看起來我們已經嘲笑了整個數據庫,但我們所做的只是模擬了離數據庫最近但離您自己的代碼最遠的類。

希望你正在使用的認證系統與LDAP適配器,您可以用模擬換出。或者PHP的ldap函數的包裝類。

更新

最大的問題是,你幾乎在每一個方法使用基本LDAP功能。真的不是代碼問題..但是很難進行單元測試。我已經通過創建一個單獨的方法來處理所有這些通信,並對此作出了我的斷言:

(免責聲明:此代碼沒有邏輯意義,根本無法工作..僅舉例而已目的)

class LDAP_Auth { 

    public function authenticate($username, $password) { 
    // Extra business logic or other things that need to be tested 
    return $this->_callLdap('ldap_bind', $username, $password); 
    } 

    protected function _callLdap() { 
    $args = func_get_args(); 
    $functionName = array_shift($args); // First argument should be the function name 

    return call_user_func_array($functionName, $args); 
    } 
} 

所以每ldap_*功能是從同一_callLdap()方法調用。如果你想測試authenticate()方法,所有你需要做的是:

  • 創建類本身的模擬對象
  • 嘲笑_callLdap方法,並斷言,它是用正確的參數調用一次
  • 然後調用authenticate()像通常那樣

事情是這樣的:

$ldapMock = $this->getMock('LDAP_Auth', array('_callLdap'); 
$ldapMock->expects($this->once()) 
    ->method('_callLdap') 
    ->with(array('ldap_bind', 'mike', 'password')) 
    ->will($this->returnValue(true)); 

$ldapMock->authenticate('mike', 'password'); 

這個測試斷言,_callLdap方法使用參數array('ldap_bind', 'mike', 'password')確保該authenticate()正常運行

+1

的事情是,它已經是一個包裝類。這就是我想嘲笑的。 – 2012-03-28 21:34:36

+0

你可以發佈一個你正試圖測試的方法的小例子,以及你想測試什麼? – 2012-03-28 21:36:16

+0

哦,這是我的一個開源項目:https://github.com/klaussilveira/SimpleLDAP – 2012-03-28 21:38:03

1

另外,OU可以使用UnboundID LDAP SDK內存服務器創建用於測試目的,一個正常運作的目錄服務器調用一次。另見:In memory Directory Server

+0

這是非常好的特里,感謝您的鏈接! – 2012-03-31 00:47:11

相關問題