PHPUnit:: Как можно протестировать функцию, которая устанавливает и получает файлы cookie?

PHPUnit:: Как может функция, которая устанавливает и получает файлы cookie, протестирована без ошибки: заголовки уже отправлены?

Пример, выдающий ошибку:

PHPUnit_Framework_Error_Warning: Невозможно изменить информацию заголовка — заголовки уже отправлены

MyCookie.php

class MyCookie{
public static function createCookie(){
        $uid = null;
        $cookieName='test_cookie';
        if(!isset($_COOKIE[$cookieName])){
            $uid = unique_hash();
            setcookie($cookieName, $uid, 0, '', '', false, true);
        }
        else{
            $uid=$_COOKIE[$cookieName];
        }
        return $uid;
    }
}

MyCookieTest.php

class MyCookieTest extends PHPUnit_Framework_TestCase{
    public function test_createCookie(){
            MyCookie::createCookie();
            assertThat(isset($_COOKIE['test_cookie']), is(true));
            unset($_COOKIE['test_cookie']);
            MyCookie::createCookie();
            assertThat(isset($_COOKIE['test_cookie']), is(true));
    }
}

Спасибо


person Ben    schedule 11.10.2010    source источник
comment
Кстати, у вас есть собственная реализация assertThat или вы используете версию кандидата на выпуск PHPUnit 3.5? sebastian-bergmann.de/archives/   -  person Anti Veeranna    schedule 15.10.2010
comment
assertThat — это библиотека Hamcrest.php, которая работает с phpunit.   -  person Ben    schedule 29.10.2010


Ответы (1)


Если ваш PHP-скрипт выполнит любой вывод, будут отправлены заголовки — и вы больше не сможете устанавливать файлы cookie. Вы должны отправить файлы cookie сначала, прежде чем сможете вывести какой-либо HTML (или другой вывод).

Если вы не выводите какой-либо HTML, то, вероятно, где-то случайно выводится пробел или знак порядка байтов Unicode. Если ваш редактор поддерживает это, настройте его так, чтобы спецификация не включалась в файлы в кодировке UTF-8.

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

person Core Xii    schedule 28.10.2010
comment
Я знаю проблему, но не знаю, как ее решить (ваши решения не будут работать). Если у вас есть решение, пожалуйста, напишите его. - person Ben; 29.10.2010
comment
Мои решения не будут работать недостаточно. Почему бы и нет? Почему они не работают? Что пойдет не так? У меня они точно работают. - person Core Xii; 29.10.2010
comment
Для потомков - это не сработает, потому что PHPUnit пишет материал до того, как начнет тест. Может помочь перенаправление вывода на sdterr. См. so - person Jerry; 07.02.2013