2012-03-28 12 views
3

私はしばらくの間PHPUnitを使用していましたが、突然大きな壁にぶつかりました。私は、デフォルトのLDAP PHP拡張を使ってLDAPサーバーと通信するための小さな抽象レイヤーを持っています。今、クラスを適切にテストするために、拡張機能の接続と機能をどうやって模擬するかについてはわかりません。PHPUnitテストスイートのためのLDAP接続の模擬

ファイルシステムとデータベースモックは非常に一般的でセットアップは簡単ですが、ディレクトリサーバーはどうですか? :

答えて

5

ファイルシステムとデータベースのモックは、ファイルシステムやデータベースを実際に作成するのではなく、通常はこれらのデータ・ソースとそこが本当に存在するかのよう特定の動作を模倣する

例:

// 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方法
  • モッククラス自体のモックオブジェクトを作成し、それが適切な引数で一度呼び出されたことを主張
  • $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'); 
    
  • その後、通常どおり、このよう

何かあなたのようauthenticate()を呼び出します210

この試験は、_callLdap方法がauthenticate()。あるいは

+1

事は、すでにラッパークラスです。それは私が嘲笑しようとしていることです。 –

+0

テストしようとしているメソッドとテストしたいメソッドの小さな例を投稿できますか? –

+0

ああ、私のオープンソースプロジェクトです:https://github.com/klaussilveira/SimpleLDAP –

1

、OUは、テスト目的のために機能するディレクトリサーバーを作成するUnboundIDのLdap SDKメモリ内のサーバーを使用することが適切に機能していることを保証paramsはarray('ldap_bind', 'mike', 'password')で一度呼び出されると主張しています。参照:In memory Directory Server

+0

それはとてもいいテリーです、リンクありがとう! –