2013-05-20 3 views
4

При использовании PHPUnit с помощью ниже кода-фрагмента в Eclipse, я получаю ошибку:PHPUnit Не удается отправить куки сессии - заголовки уже отправлены

Cannot send session cookie - headers already sent by (output started at C:\wamp\bin\php\php5.3.13\pear\PHPUnit\Util\Printer.php:172)

session_start() выполняется в «LoginTest». Как я могу остановить PHPUnit от вмешательства в генерации cookie сеанса?

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 
require_once 'C:\wamp\bin\php\php5.3.13\pear\PHPUnit\autoload.php'; 

class MyTestCase extends PHPUnit_Framework_TestCase { 
    static function main(){ 
     $suite = new PHPUnit_Framework_TestSuite("LoginTest"); 
     //$suite = new PHPUnit_Framework_TestSuite("FriendListTest"); 
     //$suite = new PHPUnit_Framework_TestSuite("UserTest"); 
     PHPUnit_TextUI_TestRunner::run($suite); 
    } 
} 
MyTestCase::main(); 
?> 

Very similar problem with solution that won't let me debug in Eclipse.

+1

Как и с любой тестируемой системой, вы не можете ожидать, что тестовая среда будет работать без каких-либо кодов независимо от того, какой из них. Ваш код, очевидно, начинает сеанс где-то, когда уже слишком поздно. Переключитесь на сеансы без cookie для вашего SUT. Не-cookie-сеансы не вызывают ошибки заголовка. – hakre

ответ

0

How can I stop PHPUnit from interfering with session cookie generation?

Наиболее прямой, кажется, не использовать куки для сессий:

http://php.net/session.use-cookies

+0

Это, похоже, не работает. Например. в верхней части модульного теста я добавил: 'ini_set ('session.use_cookies', 0); session_start();' и я получаю жалобу о «уже отправленных заголовках» на этой строке. Без строки session_start() я получаю одно и то же, но более глубокое (т. Е. В тестируемом коде). (Мне не удалось заставить его работать как в php 5.3.x, так и в 5.5.x, а также с разными версиями PHPUnit.) –

+0

@DarrenCook: Возможно, это больше, чем этот параметр, создать изолированный тестовый файл без использования php и проверить с настройками cookie. У меня нет моего большого тестового набора сеансов, поэтому я бы дважды проверил, но это должно сработать. Наверное, это больше, чем сингл? – hakre

3

В верхней части тестовой функции проблема единицы (или, если все функции будут затронуты тогда в setUp(), или даже public static function setUpBeforeClass()), добавьте этот код:

@session_start(); 

Или в длинных рук:

$prev = error_reporting(0); 
session_start(); 
error_reporting($prev); 

Это выглядит как-то вы никогда не должны делать, но он идеально подходит здесь, потому что подавляя сообщение об ошибке было именно то, что мы хотели сделать!


Как я отметил в комментарии ответа hakre, в теребя ини настройки никогда не работал, даже не пытаясь этой комбинации перед вызовом session_start():

ini_set("session.use_cookies",0); 
ini_set("session.use_only_cookies",0); 
ini_set("session.use_trans_sid",1); 
+0

Это работает, но затем вы получите соответствующее предупреждение о том, что «сеанс уже запущен». В ситуации тестирования phpunit вы можете просто ввести код входа в набор для тестирования, чтобы избежать необходимости иметь дело с этим (законным) предупреждением, убивающим ваши тесты. – Kzqai

+0

@Kzqai Да, поэтому знак '@' есть и важен. –

+0

Это помогает подавить сообщение 'session_start(): Не удается отправить cookie сеанса - заголовки, уже отправленные .... Однако это все равно приведет к ошибке при тестировании. Так что это не решение. – w00tland

Смежные вопросы