10

ログインの背後にあり、zend_aclとzend_authを利用するアプリケーションがあります。

ディスパッチ前に、ACLのすべてのルールを作成するACLプラグインがあります。また、ログインしているかどうか、ログインしているかどうか、ACLに従って要求されたリソースにアクセスできるかどうかを確認するAuthプラグインもあります。

アプリケーションは完全にログインの背後にあるため、ACLはログインしている場合にのみ作成されます。

これをユニットテストすることは不可能であるように思われます、あるいはむしろ私が明白な何かを見逃している可能性が高いです。

単体テストのセットアップメソッドでは、zend_authインスタンスを返すログインの成功をシミュレートします。合格したテストは、このログインが成功したことを示しています。

ただし、テストを通じて別の場所にディスパッチしようとしたり、ログインしたユーザーが特定のリソースにアクセスできるかどうかを評価したりすると、まだログインしていないため、プラグインによって常に拒否されます。これがなぜであるかはわかりません。 、誰かアドバイスできますか?

たとえば、これは次のように合格します。

 public function testLoggedIn()
 {
  $this->assertTrue( Zend_Auth::getInstance()->hasIdentity() );
 }

プラグインによって拒否されるため、これは失敗します。

 public function testUserAccess()
 {

   $this->dispatch('/home');
          $this->assertResponseCode(200);
          $this->assertQueryContentContains('#nav_side');  
          $this->resetRequest()
           ->resetResponse();

 }

これは、プラグインがユーザーがログインしていることを認識していないため、まだログインページにリダイレクトしているように見えることを発見しました。

どんな助けでも大歓迎です。

4

2 に答える 2

4

テスト中に ACL プラグイン (または任意のプラグイン) を置き換えるスタブを作成する別の方法を次に示します。これを ControllerTestCase に入れて、テスト ケース setUp で呼び出します。

public function doLogin ()
{
    // create a fake identity
    $identity = new stdClass();
    $identity->Username = 'PHPUnit';
    Zend_Auth::getInstance()->getStorage()->write($identity);

    // remove the autoloaded plugin
    $front = Zend_Controller_Front::getInstance();
    $front->unregisterPlugin('My_Controller_Plugin_Acl');

    // create the stub for the Acl class
    $mockaAcl = $this->getMock(
      'My_Controller_Plugin_Acl',
      array('preDispatch'),
      array(),
      'My_Controller_Plugin_AclMock'
    ); 

    // register the stub acl plugin in its place
    $front->registerPlugin($mockAcl); 
}

このようにして、代わりにスタブの preDispatch メソッドが呼び出され、実際のアクセス制御チェックがバイパスされます。

于 2012-01-30T10:01:36.520 に答える
3

あなたが説明する問題は、グローバル変数と OOP グローバル変数 (シングルトン パターン) の使用で多く発生します。

依存性注入を使用してそれを回避する方法と、他にどのような可能性があるかを説明している PHPUnit の作者による記事があります。 .de/archives/882-Testing-Code-That-Uses-Singletons.html

醜い代替手段 (迅速な結果が必要な場合) として、Zend_Auth のスタブを作成し (リンクに記述)、PHP 5.3 リフレクション API を使用して Zend_Auth インスタンス変数をスタブに設定することができます。

それが役立つことを願っています(質問は他の回答なしで4時間生きていたので)

于 2010-07-28T16:00:00.103 に答える