PHPUnit无法发送会话cookie-已发送头

PHPUnit无法发送会话cookie-已发送头,php,eclipse,session,phpunit,Php,Eclipse,Session,Phpunit,在Eclipse中通过以下代码段使用PHPUnit时,我发现了错误: 无法发送会话cookie-标头已由发送(输出已启动) 位于C:\wamp\bin\php\php5.3.13\pear\PHPUnit\Util\Printer.php:172) 会话_start()在“LoginTest”中执行。如何阻止PHPUnit干扰会话cookie生成 <?php error_reporting(E_ALL); ini_set('display_errors', 1); require_once

在Eclipse中通过以下代码段使用PHPUnit时,我发现了错误:

无法发送会话cookie-标头已由发送(输出已启动) 位于C:\wamp\bin\php\php5.3.13\pear\PHPUnit\Util\Printer.php:172)

会话_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();
?>

如何阻止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();
?>
大多数直截了当的人似乎不会在会话中使用cookies:


在问题单元测试函数的顶部(或者如果所有函数都受到影响,则在
设置()
,甚至
公共静态函数setupforeclass()
)中添加以下代码:

@session_start();
或者说:

$prev = error_reporting(0);
session_start();
error_reporting($prev);
这看起来像是你永远不应该做的事情,但在这里它是完美的,因为抑制错误消息正是我们想要做的


正如我在对hakre答案的评论中所指出的,摆弄ini设置从来都不起作用,甚至在调用
session\u start()


将以下内容添加到phpunit.xml中

<php>
    <ini name="session.use_cookies" value="0" />
    <ini name="session.use_only_cookies" value="0" />
    <ini name="session.use_trans_sid" value="0" />
    <ini name="session.cache_limiter" value="" />
</php>


与任何正在测试的系统一样,您不能期望测试环境在任何代码下都能正常工作,无论是哪种代码。显然,代码在某个地方启动会话时已经太晚了。切换到SUT的非cookie会话。非Cookie会话不会导致标头错误。这似乎不起作用。例如,在我添加的单元测试的顶部:
ini\u集('session.use\u cookies',0);会话_start()我在那行收到了关于“标题已发送”的投诉。如果没有session_start()行,我只会得到同样的东西,但会更深一些(例如,在正在测试的代码中)。(我还没能在PHP5.3.x和5.5.x中以及PHPUnit的不同版本中使用它。)@DarrenCook:这可能不止是这个设置,创建一个不带php单元的独立测试用例,并在那里检查cookie设置。我这里没有我的大型会话测试套件,所以我会再次检查,但这应该可以工作。可能不止一个命名设置?!这是可行的,但随后您会收到相关警告“会话已启动”。在phpunit测试情况下,您可以只@抑制测试套件中的登录代码,以避免必须处理终止测试的(合法)警告。@Kzqai是的,这就是为什么有
@
符号,而且很重要。这有助于抑制消息
会话\u start():无法发送会话cookie-标头已由…发送。
。但是,它仍然会在测试中产生错误。所以这不是一个真正的解决方案。@w00t在我写这篇文章的时候,它正在工作(因为在运行测试时没有给出错误,所有测试都通过了)。也就是说,无论我当时使用什么版本的PHP和phpunit。你用的是什么版本?这可能是phpunit中的某些东西发生了变化,现在停止了黑客的工作环境。或者可能是你测试中的其他错误?