“PHPUnit 测试资源管理器”VS Code 扩展给出“session_start(): 会话在标头已发送后无法启动”错误

问题描述 投票:0回答:1

我是使用“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));
    }
}
?>

请帮忙

提前致谢:)

php phpunit
1个回答
0
投票

要了解不需要的标头发送到底发生在哪里,您可以编写代码:

 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

© www.soinside.com 2019 - 2024. All rights reserved.