2

我有一段代码正在使用 PHPUnit 进行测试,但收到以下错误:

session_regenerate_id(): Cannot regenerate session id - headers already sent

我想知道标头的发送位置;一般来说,当我在浏览器中测试代码时,我会看到一条警告,其中提到了这样的位置:

Warning: Cannot modify header information - headers already sent by 
(output started at /www/xxxx/x.php:52) in /www/xxxx/index.php on line 123

但是在 PHPUnit 测试中,没有这样的信息;PHPUnit 只显示上面的错误和回溯:

/var/www/yii/framework/web/CHttpSession.php:166
/var/www/yii/framework/web/auth/CWebUser.php:681
/var/www/yii/framework/web/auth/CWebUser.php:214
...

这只是指出错误发生的位置。

我能做些什么?

4

2 回答 2

1

它告诉您标头已发送到何处。
解决方案是在测试函数中模拟会话组件。

$mockSession = $this->getMock('CHttpSession', array('regenerateID'));  
Yii::app()->setComponent('session', $mockSession);
于 2013-02-14T14:58:49.797 回答
0

我得到了同样的错误,但我不使用 Yii。这是我使用ob_*函数解决它的方法:

我使用一个phpunit.xml配置文件,其中提到了一个引导文件:

<phpunit bootstrap="phpunit_bootstrap.php">
    ...
</phpunit>

phpunit_bootstrap.php我开始使用ob_start()

<?php
ob_start();
// some other configuration lines ...

然后我在测试类中使用了 2 个PHPUnit方法:

// Erase output buffer before starting the tests
public static function setUpBeforeClass(){
    ob_clean();
}

// Turn off output buffering after the tests
public static function tearDownAfterClass(){
    ob_end_clean();
}

于 2018-12-01T22:43:28.663 回答