Подтвердить что ты не робот

Выход 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 без него).

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

Спасибо!

UPDATE:

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

<?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.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Zend_Session::$_unitTestEnabled = true;

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Zend_Session::$_unitTestEnabled = true;

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

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

Таким образом, вам больше не придется его менять.