Zend_Test — Настройка перенаправления в плагине контроллера для PHPUnit

#php #unit-testing #zend-framework #testing

#zend-framework #перенаправление #phpunit

Вопрос:

Я пытался использовать PHPUnit для тестирования приложения. У меня все это работает, но я не могу протестировать перенаправления.

Мои перенаправления происходят внутри плагина контроллера Acl, а не внутри действия в контроллере.

Я изменил их, чтобы использовать предлагаемый формат

 $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$r->gotoSimple("index", "index", "default");
  

Но в тестах это не удается, тело ответа пустое, и я получаю ошибки типа

 Zend_Dom_Exception: Cannot query; no document registered
  

Если я затем изменю тест так, чтобы метод отправки не приводил к gotoSimple() вызову, тогда тест выполняется правильно.

Как я должен выполнить перенаправление в моем приложении, чтобы оно корректно работало с Zend_Test объектом response?

Документы Zend описывают это примерно в двух строках, которые я пробовал, и это не удается.

Спасибо.

Ответ №1:

Чтобы проверить, произошло ли перенаправление, вам необходимо добавить

 $this->assertRedirectTo( 'index' );
  

после запуска $this->dispatch();

Вы не можете запросить тело ответа, поскольку оно пустое в случае перенаправления (вот откуда берется ваше исключение).
Вы всегда можете проверить, как на самом деле выглядит ответ с помощью

 print_r( $this->getResponse() );
  

Комментарии:

1. Ах. Это имеет смысл. Хотел бы я знать это раньше — значит, тест не следует за перенаправлением?

2. Он не перезаписывает объект ответа содержимым, полученным из перенаправления — если вы это имеете в виду

3. Прямо сейчас я знаю, что могу продолжать. Что-то, о чем не упоминают документы!

Ответ №2:

Убедитесь, что ваши действия возвращают что-либо после перенаправлений, потому что Zend_Test_PHPUnit отключает перенаправления, поэтому код после перенаправления также выполняется.

 $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$r->gotoSimple("index", "index", "default");
return;
  

или

 $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
return $r->gotoSimple("index", "index", "default");
  

Чтобы протестировать само перенаправление, вы можете использовать assertRedirect* утверждения.

Прочитайте приведенное выше руководство, потому что там есть важные замечания о перехватах действий.

Комментарии:

1. Я всегда возвращаюсь после любого типа перенаправления, я думаю, моя проблема связана с тем, что я думал, что тест вернет содержимое перенаправления. Теперь я знаю, что это не очень хорошо.