2012-03-28 125 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

相关问题