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()
内でのみテストしました)