我一直在使用的PHPUnit有一段時間了,但突然懲戒LDAP連接打了一個大牆:嘲諷LDAP。我有一個小的抽象層用於使用默認的LDAP PHP擴展與LDAP服務器進行通信。現在,我不知道如何嘲笑擴展的連接和功能,以便正確測試我的課程。爲PHPUnit的測試套件
文件系統和數據庫嘲笑是相當常見的,易於安裝,但對於目錄服務器? :(
我一直在使用的PHPUnit有一段時間了,但突然懲戒LDAP連接打了一個大牆:嘲諷LDAP。我有一個小的抽象層用於使用默認的LDAP PHP擴展與LDAP服務器進行通信。現在,我不知道如何嘲笑擴展的連接和功能,以便正確測試我的課程。爲PHPUnit的測試套件
文件系統和數據庫嘲笑是相當常見的,易於安裝,但對於目錄服務器? :(
你應該嘲笑你的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()
正常運行
另外,OU可以使用UnboundID LDAP SDK內存服務器創建用於測試目的,一個正常運作的目錄服務器調用一次。另見:In memory Directory Server。
這是非常好的特里,感謝您的鏈接! – 2012-03-31 00:47:11
的事情是,它已經是一個包裝類。這就是我想嘲笑的。 – 2012-03-28 21:34:36
你可以發佈一個你正試圖測試的方法的小例子,以及你想測試什麼? – 2012-03-28 21:36:16
哦,這是我的一個開源項目:https://github.com/klaussilveira/SimpleLDAP – 2012-03-28 21:38:03