PhpStorm, PHPUnit и setcookie - PullRequest
       30

PhpStorm, PHPUnit и setcookie

4 голосов
/ 29 марта 2011

Я пытаюсь сделать несколько модульных тестов, используя функцию setcookie () в довольно хорошей IDE PhpStorm.Но я каждый раз получаю следующую ошибку:

Cannot modify header information - headers already sent by (output started at /tmp/phpunit.php:418)

Вероятно, причиной этой ошибки является print ('некоторый текст') с flush () перед вызовом setcookie ().Но сброс выполняется в файле /tmp/phpunit.php, созданном PhpStorm.Пока setcookie () вызывается из моих источников.Поэтому я не могу отредактировать сгенерированный файл для выполнения какой-либо буферизации вывода.Также есть еще один момент: PhpStorm выполняет скрипт /tmp/phpunit.php следующим образом:

/usr/bin/php /tmp/phpunit.php -config /var/www/.../protected/tests/phpunit.xml d /var/www/.../protected/tests/unit/user

Пожалуйста, помогите мне обойти эту проблему.Как я могу запустить модульные тесты из PhpStorm напрямую?

Ответы [ 3 ]

6 голосов
/ 29 марта 2011

Один из возможных способов обойти это - использовать «ложную» замену для функции setcookie().

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

Способ сделать это - создать определение функции-заглушки для setcookie() в вашем коде модульного теста. Затем он будет вызываться во время теста вместо реальной функции setcookie(). Как именно вы реализуете эту функцию-заглушку, зависит от вас, и будет зависеть от того, для чего ваш код ее использует.

Основная проблема, с которой вы столкнетесь при таком подходе, заключается в том, что PHP не позволяет переопределять существующие функции по умолчанию - если вы попробуете это в стандартной установке PHP, вы получите «error: function not redeclared» .

Решением этой проблемы является расширение PHP1 Runkit , которое специально разработано для такого типа тестирования и позволяет переименовывать существующую функцию , включая встроенную.

Если вы сконфигурируете установку PHP в своей среде тестирования для включения расширения Runkit, вы сможете выполнить этот вид теста.

Надеюсь, это поможет.

3 голосов
/ 27 апреля 2017

Я нашел более простое решение.Рассмотрим этот класс:

class Cookie
{
    public function set($name, $value)
    {
        return setcookie($name, $value);
    }
}

Тест выдаст ошибку, описанную в вопросе, если вы не установите аннотацию @ runInSeparateProcess

class CookieTest
{
    /**
     * @runInSeparateProcess
     */
    function test_set()
    {
        $cookie = new Cookie;
        $this->assertTrue($cookie->set('mycookie', 'myvalue');
    }
}
0 голосов
/ 26 декабря 2018

Вместо того, чтобы пытаться установить фактические заголовки файла cookie (что не удастся, потому что контент уже был отправлен); В тестовых целях вы можете просто установить суперглобальный COOKIE явно:

$_COOKIE['mycookie']=myvalue';
...