#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. Я всегда возвращаюсь после любого типа перенаправления, я думаю, моя проблема связана с тем, что я думал, что тест вернет содержимое перенаправления. Теперь я знаю, что это не очень хорошо.