为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