【问题标题】:PHPUnit Cannot send session cookie - headers already sentPHPUnit 无法发送会话 cookie - 标头已发送
【发布时间】:2013-05-15 11:00:23
【问题描述】:

在 Eclipse 中通过以下 code-sn-p 使用 PHPUnit 时,出现错误:

无法发送会话 cookie - 标头已由(输出开始 在 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.

【问题讨论】:

  • 与任何被测系统一样,您不能指望测试环境可以无缝地处理任何代码,无论是哪一个。当为时已晚时,您的代码显然会在某个地方开始会话。为您的 SUT 切换到非 cookie 会话。非 Cookie 会话不会导致标头错误。

标签: php eclipse session phpunit


【解决方案1】:

如何阻止 PHPUnit 干扰会话 cookie 的生成?

最直接的方法似乎不使用 cookie 进行会话:

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

【讨论】:

  • 这似乎不起作用。例如。在我添加的单元测试的顶部:ini_set('session.use_cookies', 0);session_start(); 并且我在该行收到有关“标头已发送”的投诉。如果没有 session_start() 行,我只会得到相同但更深的东西(即在被测试的代码中)。 (我还没有设法让它在 php 5.3.x 和 5.5.x 以及不同版本的 PHPUnit 中工作。)
  • @DarrenCook:这可能不仅仅是这个设置,创建一个没有 php 单元的独立测试用例并检查那里的 cookie 设置。我这里没有大型会话测试套件,所以我会仔细检查一下,但这应该可以。可能不仅仅是单一的命名设置?!
【解决方案2】:

在问题单元测试函数的顶部(或者如果所有函数都受到影响,那么在setUp(),甚至public static function setUpBeforeClass())添加以下代码:

@session_start();

或者是长手:

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

这看起来像是你不应该做的事情,但它在这里是完美的,因为抑制错误消息正是我们想要做的!


正如我在对 hakre 的回答的评论中指出的那样,摆弄 ini 设置从未奏效,甚至在致电 session_start() 之前尝试过这种组合:

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

【讨论】:

  • 这可行,但随后您会收到“会话已开始”的相关警告。在 phpunit 测试情况下,您可以只 @suppress 测试套件中的登录代码,以避免不得不处理(合法的)警告杀死您的测试。
  • @Kzqai 是的,这就是@ 符号存在的原因,而且很重要。
  • 这有助于抑制消息session_start(): Cannot send session cookie - headers already sent by ...。但是,它仍然会在您的测试中产生错误。所以这并不是真正的解决方案。
  • @w00tland 在我写这篇文章时它正在工作(因为在运行测试时没有给出错误,所有测试都通过了)。 IE。使用我当时使用的任何版本的 PHP 和 phpunit。你用的是什么版本?可能是 phpunit 中的某些内容发生了变化,现在停止使用 hacky 解决方法。或者它可能是您的测试中的其他错误?
【解决方案3】:

将以下内容添加到您的 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>

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 2013-04-25
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2017-08-29
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多