Выход PHPUnit, вызывающий исключения Zend_Session

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

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-сервере без него).

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

Благодаря!

ОБНОВИТЬ:

Чтобы попытаться еще больше изолировать проблему, я взял 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.

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

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

Это направляет вывод phpunit в stderr, не позволяя ему прерывать генерацию заголовка HTTP.

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

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

 Zend_Session::$_unitTestEnabled = true; 

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

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

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

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

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

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

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

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

 Zend_Session::$_unitTestEnabled = true; 

В моем случае я помещаю что-то вроде в файл bootstrap.php

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

Поэтому вам больше не придется его менять.