我是使用“PHPUnit test explorer”VS Code 扩展进行 PHP 单元测试的新手。
我在运行 php 单元测试时遇到以下错误:
session_start():在发送标头后无法启动会话
错误堆栈跟踪:
DbconTest
❌ testAdd 6 ms
┐
├ session_start(): Session cannot be started after headers have already been sent
│
│ D:\AJ\xampp\htdocs\somename\dbcon.php:28
│ D:\AJ\xampp\htdocs\somename\dbcon.php:13
│ D:\AJ\xampp\htdocs\somename\tests\DbconTest.php:11
│ D:\AJ\xampp\htdocs\somename\vendor\phpunit\phpunit\phpunit:98
┴
下面是我的代码:
DbconTest.php =>
<?php
use PHPUnit\Framework\TestCase;
require_once __DIR__ . 'dbcon.php';
class DbconTest extends TestCase
{
public function testAdd()
{
$db_con = new Dbcon();
$result = $db_con->add(1, 2);
$this->assertEquals(3, $result);
}
}
?>
dbcon.php =>
<?php
include_once dirname(__DIR__).'config.php';
class Dbcon {
public $con;
private $valid_data_types;
public function add($a, $b) {
return $a + $b;
}
function __construct() {
$this->create_connection();
$this->valid_data_types = [
'integer' => 'i',
'float' => 'd',
'double' => 'd',
'blob' => 'b',
'string' => 's',
'NULL' => 's',
];
}
function create_connection() {
ob_start();
if (! isset($_SESSION)) {
session_start();
}
$this->con = mysqli_connect(HOST, USER, PASS) or die(mysqli_connect_error());
mysqli_select_db($this->con, DB_NAME) or die(mysqli_error($this->con));
}
}
?>
请帮忙
提前致谢:)
要了解不需要的标头发送到底发生在哪里,您可以编写代码:
function create_connection() {
headers_sent($file, $line);
echo "$file: $line";
# Most likely it will be vendor/phpunit/phpunit/src/Util/Printer.php: 104
为了避免与此位置发生冲突,您可以通过 phpunit.xml 将每个测试配置为与其他测试隔离运行:
<phpunit
...
processIsolation="true"
>
另请注意,不再需要
ob_start()
,最好将其删除,或者在测试完成后执行ob_end_clean();
。否则,系统将无法正确显示测试结果,并将其标记为Risky