Это проблема из двух частей.Во-первых, перенаправитель по умолчанию вызывает 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');
Но это не будет работать из-за метода routeStartup()
, потому что ZF сразу же запускает маршрутизатор, который переопределяет параметры запроса, которыеуказанный метод redirect()
Вам нужно будет переделать верстку вашего плагина, чтобы вызвать перенаправления из routeShutdown()
или другие методы, которые вызываются даже позже в цикле отправки.(Я проверял это только в routeShutdown()
.)