2011-01-02 5 views
2

Zend Testでコントローラプラグインのリダイレクトに問題があると思われますか?Zend_Test&Controller(ACL)のリダイレクト

私はhttp://pastie.org/1422639のようなコントローラプラグインを持っています。私はデバッグのためにecho文を入れました。私は私が得たときにユニットtesing、例えば

$this->dispatch('/projects'); 

出力は

プロジェクト(OK Iだったことが判明が

if (!$auth->hasIdentity()) { 
    echo 'no id, '; 
    // redirect to login page 
    $req->setDispatched(true); 
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');echo 'got redir, '; 
    $redirector->gotoUrl('/auth/login?returnUrl=' . urlencode($req->getRequestUri()));echo 'redirecting, '; 
} ... 

ログインしていない場合は、ログインにリダイレクトするためのコードを持っています私はリダイレクタを持っています)、リダイレクトしています(リダイレクトされているようです...)、エラー(しかし、私はエラーコントローラ)no resource、

私がエラーコントローラになった理由は、プロジェクト/インデックスページにまだ残っているからです。 indexアクションで、私は、ユーザーがログインしていると仮定した。しかし、それはそれが失敗したユーザー

$user = \Zend_Auth::getInstance()->getIdentity(); 

にログイン取得しようとするとき...

は、どのように私はZendのテストで働いリダイレクタを持つことができますか?それとも、リダイレクタの問題ではないでしょうか?

答えて

3

2つの問題があります。最初に、リダイレクタはデフォルトでリダイレクト後にPHPのexitを呼び出し、Zend_Testの実行を停止します。あなたのテストでは、それをしないようにリダイレクターを設定する必要があります。このような何か:

$redirector = new Zend_Controller_Action_Helper_Redirector(); 
if (APPLICATION_ENV == 'testing') { 
    $redirector->setExit(false); 
} 
$redirector->gotoUrl("/blah/blah"); 

が、コントローラのプラグインに問題がリダイレクタを使用した後、ディスパッチループに入ると、とにかくアクションメソッドを実行しようとしているから、Zend Frameworkのを防止するための方法はありませんということです。 Zend Frameworkの既知の問題であることを、開発者が取り組む予定のさまざまなフォーム・ポスト(どこにあるのかを覚えていない)で読んだことがあります。今のところ、私は私のエラーコントローラには、このような方法を追加することでこの問題を回避:

public function pluginRedirectorAction() { 
    $this->_helper->layout()->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 

    $code = $this->_getParam('code'); 
    $uri = $this->_getParam('uri'); 

    if (APPLICATION_ENV == 'testing') { 
     $this->_helper->redirector->setExit(false); 
    } 
    $this->_helper->redirector->setCode($code); 
    $this->_helper->redirector->gotoUrl($uri); 
} 

はその後、私のコントローラのプラグインでは、私がリダイレクトを呼び出すためのカスタムメソッドを持っています。

protected function redirect($code, $uri) { 
    $redirector = new Zend_Controller_Action_Helper_Redirector(); 

    if (APPLICATION_ENV == 'testing') { 
     $request = $this->getRequest(); 
     $request->setModuleName('default'); 
     $request->setControllerName('error'); 
     $request->setActionName('plugin-redirector'); 
     $request->setParam('code', $code); 
     $request->setParam('uri', $uri); 

     $redirector->setExit(false); 
    } 

    $redirector->setCode($code); 
    $redirector->gotoUrl($uri); 
} 

ことによりリダイレクタへの実際の呼び出しをアプリのコントローラレイヤに移動すると、ユニットテストが正常に動作するようになります(別名$this->assertRedirectTo('/blah/blah');)。これにより、上に示したエラーコントローラのpluginRedirectorAction()メソッドを指すリクエストが変更されます。お使いのコントローラプラグインの中に次のように呼ばれてリダイレクトします。

return $this->redirect(307, '/somewhere/else'); 

しかし、ZFはredirect()メソッドは、指定されたリクエストパラメータを上書きしますこれは、右のその後ルータを発射するので、それはrouteStartup()メソッド内から動作しません。 。 routeShutdown()からのリダイレクト、またはディスパッチサイクルの後半でも呼び出される他の方法からプラグインの配管を再加工する必要があります。 (私はこれをrouteShutdown()内でのみテストしました)