gpt4 book ai didi

php - 模拟 PHPUnit 测试套件的 LDAP 连接

转载 作者:可可西里 更新时间:2023-11-01 00:35:16 27 4
gpt4 key购买 nike

我已经使用 PHPUnit 一段时间了,但突然遇到了一个大问题:模拟 LDAP。我有一个小的抽象层,用于使用默认的 LDAP PHP 扩展与 LDAP 服务器通信。现在,我不知道如何模拟扩展的连接和功能以正确测试我的类(class)。

文件系统和数据库模拟非常普遍且易于设置,但是目录服务器呢? :(

最佳答案

您应该模拟您的 LDAP 适配器,而不是 PHP 扩展。文件系统和数据库模拟的工作方式相同......它们实际上并不创建文件系统或数据库,它们只是表示通常与这些数据源交互并模仿某些行为的类,就好像它们确实存在一样。

例如:

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

通常,此调用会转到数据库并查询用户 12345。但是,我们模拟了 PDO 适配器并告诉它在 query()execute() 方法使用预期参数调用。因此,虽然看起来我们已经模拟了整个数据库,但我们真正所做的只是模拟了离数据库最近但离您自己的代码最远的类。

希望您使用的是带有 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( ) 正常运行

关于php - 模拟 PHPUnit 测试套件的 LDAP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com