Zend_Controller_Response_Exception: Невозможно отправить заголовки; - PullRequest
4 голосов
/ 16 ноября 2011

при запуске всего теста для приложения Zend, эта строка:

protected function _getResp()
{
    if (is_null($this->_response))
        $this->_response = new Zend_Controller_Response_Http();
    return $this->_response;
}
.......
$this->_getResp()->setHeader('Content-Type', 'text/html; charset=utf-8', true);

генерирует следующую ошибку:

Zend_Controller_Response_Exception: Невозможно отправить заголовки;заголовки уже отправлены в /usr/share/php5/PEAR/PHPUnit/Util/Printer.php, строка 173

и в результате - тест не пройден

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

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

public function setResp(Zend_Controller_Response_Http $resp) {
    $this->_response = $resp;
}

Создайте новый Zend_Controller_Response_HttpTestCase и передайте его setResp() на объекте, который вы тестируете.Это также позволит вам проверить, что правильные заголовки были «отправлены» вместе с выводом.

0 голосов
/ 14 июля 2013

В моем случае у меня есть объекты пользовательских запросов и ответов: My_Controller_Request_Rest и My_Controller_Response_Rest.

Что я сделал, чтобы решить эту проблему, я создал новые My_Controller_Request_RestTestCase и My_Controller_Response_RestTestCase, которые расширяют Zend_Controller_Request_HttpTestCase и Zend_Controller_Response_HttpTestCase соответственно.

То, что предложил Дэвид Харкнесс , на самом деле решает проблему. Единственное, что ваши объекты должны расширять класс HttpTestCase, соответствующий каждому классу.

Вам необходимо создать сеттеры для каждого объекта, поскольку вы не можете устанавливать их напрямую.

У меня есть следующий ControllerTestCase код:

tests/application/controllers/ControllerTestCase.php

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    /**
     * Application instance.
     * @var Zend_Application
     */
    protected $application;

    /**
     * Setup test suite.
     *
     * @return void
     */
    public function setUp()
    {
        $this->_setupInitializers();
        $this->bootstrap = array(
            $this,
            'applicationBootstrap',
        );
        parent::setUp();

        $this->setRequest(new My_Controller_Request_RestTestCase());
        $this->setResponse(new My_Controller_Response_RestTestCase());
    }
}

Мои объекты запросов и ответов имеют следующую подпись:

library/My/Controller/Request/Rest.php

class My_Controller_Request_Rest extends Zend_Controller_Request_Http
{
    // Nothing fancy.
}

library/My/Controller/Response/Rest.php

class Bonzai_Controller_Response_Rest extends Zend_Controller_Response_Http
{
    // Nothing fancy either
}

Теперь я не могу понять, как избежать повторения одного и того же кода в library/My/Controller/Request/Rest.php и library/My/Controller/Controller/Request/RestTestCase.php. В моем случае код такой же, как в Request / Rest.php и Request / RestTestCase.php, а также в Response / Rest.php и Response / RestTestCase.php, но они расширяются Zend_Controller_(Request|Response)_HttpTestCase.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...