Вывод PHPUnit, вызывающий исключения Zend_Session - PullRequest
26 голосов
/ 31 марта 2011

Я получаю множество ошибок, подобных этой:

Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /usr/local/zend/share/pear/PHPUnit/Util/Printer.php/173

При запуске набора тестов моего приложения. Это с PHPUnit 3.5.10 и PHP 5.3.5.

Нет таинственных, неожиданных выходных данных, которые вызывают это. Я определил, что «вывод, отправляемый в браузер» - это фактический вывод выполняемых тестов PHPUnit. Если я открою PHPUnit / Util / Printer.php и оберну строку print $buffer с if (strpos($buffer, 'PHPUnit 3.5.10 by Sebastian Bergmann') === false) (фактически остановив первую строку вывода из PHPUnit), то мой первый тест завершится успешно (пока тестовый пример не выведет точку, указывающую проверка прошла успешно, затем следующий тест не пройден, потому что была выведена точка).

Другой разработчик из моей команды может успешно запустить полный набор тестов, поэтому я знаю, что это не проблема с кодом приложения. Это должен быть какой-то параметр конфигурации или проблема с моей локальной средой.

Я уже проверил php.ini, чтобы убедиться, что output_buffering включен и implicit_flush выключен, и они есть.

Я также пытался добавить Zend_Session::$_unitTestEnabled = true; к моей тестовой загрузке, но это не помогло (и в любом случае не должно быть необходимо, потому что оно работает на компьютере другого разработчика и на нашем сервере CI без него).

Какие-либо предложения, кроме игнорирования ошибок? Я никогда не видел ничего подобного и действительно в растерянности.

Спасибо!

UPDATE:

Чтобы попытаться еще больше изолировать проблему, я вынул ZF и мое приложение из уравнения, выполнив следующий тестовый скрипт:

<?php

class SessionTest extends PHPUnit_Framework_TestCase
{
    public function testSession()
    {
        session_start();
        $this->assertTrue(true);
    }
}

Тест не пройден:

1) SessionTest::testSession
session_start(): Cannot send session cookie - headers already sent by (output started at /home/mmsa/test.php:1)

Однако точно такой же тест работает на машине друга. Та же версия PHP и PHPUnit.

Ответы [ 5 ]

37 голосов
/ 01 апреля 2011

Запустите phpunit с флагом -stderr, (более новые версии могут использовать вместо него --stderr), например,

 phpunit -stderr mytest.php
 # or
 phpunit --stderr mytest.php

Это направляет вывод phpunit в stderr, предотвращая его прерывание генерации HTTP-заголовка.

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

6 голосов
/ 08 января 2014

Я думаю, что лучше использовать

Zend_Session::$_unitTestEnabled = true;

Использование этого в моем тесте начальной загрузки предотвращает эту ошибку.

1 голос
/ 01 апреля 2011

Если бинарный файл php, используемый PHPUnit в вашей системе, является CGI вместо версии CLI, тогда session_start действительно попытается установить куки, и вы получите эту ошибку.

Вы можете проверить, какой SAPI вы используете, позвонив по номеру php_sapi_name.

0 голосов
/ 20 марта 2017

Как и Макор сказал, вам просто нужно добавить это в вашем bootstrap.php

Zend_Session::$_unitTestEnabled = true;

В моем случае я поместил что-то вроде в моем bootstrap.php file

if(APPLICATION_ENV == 'testing' && php_sapi_name() == 'cli') {
    Zend_Session::$_unitTestEnabled = true;
}

Так что вам больше не нужно его менять.

0 голосов
/ 07 февраля 2014

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

Добавлены следующие две строки в bootstrap.php:

ini_set('session.use_cookies', 0);
ini_set('session.cache_limiter', '');

Это должно предотвратить отправку заголовков до запуска вашего набора тестов.

...