Ложное соединение LDAP для PHPUnit Test Suite - PullRequest
3 голосов
/ 29 марта 2012

Я уже некоторое время использую PHPUnit, но неожиданно натолкнулся на большую стену: издевательство над LDAP. У меня есть небольшой уровень абстракции для связи с сервером LDAP с использованием расширения LDAP PHP по умолчанию. Прямо сейчас я понятия не имею, как смоделировать соединение и функциональные возможности расширения, чтобы правильно протестировать мой класс.

Моды файловой системы и базы данных довольно распространены и просты в настройке, но как насчет серверов каталогов? (

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Вы должны издеваться над вашим адаптером LDAP, а не над расширением PHP. Моды файловой системы и базы данных работают одинаково ... на самом деле они не создают файловые системы или базы данных, они просто представляют класс, который обычно взаимодействует с этими источниками данных и имитируют определенное поведение, как если бы оно действительно существовало.

Например:

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

Обычно этот вызов отправляется в базу данных и запрашивает пользователя 12345. Однако мы смоделировали адаптер PDO и сказали ему отвечать данными, когда его методы query() или execute() вызываются с ожидаемыми параметрами. , Итак, хотя кажется, что мы смоделировали всю базу данных, все, что мы на самом деле сделали, это высмеяли класс, ближайший к базе данных, но самый удаленный от вашего собственного кода.

Надеемся, что вы используете систему аутентификации с адаптером LDAP, которую вы можете сменить. Или класс-оболочка для функций ldap в PHP.

Обновление

Большая проблема в том, что вы используете базовые функции 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 голос
/ 29 марта 2012

В качестве альтернативы, вы можете использовать сервер оперативной памяти UnboundID Ldap SDK, чтобы создать работающий сервер каталогов для целей тестирования. Смотрите также: В памяти Directory Server .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...