2012-03-28 2 views
3

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

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

ответ

5

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

. Например:

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

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

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

Update

Большая проблема заключается в том, что вы используете основные функции 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 вызывается один раз с Params array('ldap_bind', 'mike', 'password') страхующих, что authenticate() правильно функционирует

+1

Дело в том, что это уже класс обертки. Вот что я пытаюсь высмеять. –

+0

Можете ли вы опубликовать небольшой пример метода, который вы пытаетесь проверить, и для чего вы хотите проверить? –

+0

О, это мой проект с открытым исходным кодом: https://github.com/klaussilveira/SimpleLDAP –

1

В качестве альтернативы, НУ может использовать сервер UnboundID Ldap SDK в памяти, чтобы создать сервер каталогов функционирования для целей тестирования. См. Также: In memory Directory Server.

+0

Это очень приятно Терри, спасибо за ссылку! –