Phpunit、测试代码或测试代码没有(仅)关闭自己的输出缓冲区

Phpunit, test code or tested code did not (only) close its own output buffers

提问人:John Smith 提问时间:8/27/2022 更新时间:8/27/2022 访问量:634

问:

我有一个代码要测试:

class ToTest
{
    public function testMe()
    {
        echo 'test';
    }
}

class TestTest extends \PHPUnit\Framework\TestCase
{
    public function testX()
    {
        ob_start();
        (new ToTest())->testMe();
        $c = ob_get_clean();

        $this->assertSame('test', $c);
    }
}

这通过,但标记为有风险的测试:

Test code or tested code did not (only) close its own output buffers

对我来说,看起来我很好地处理了输出缓冲......

phpunit 输出缓冲

评论


答:

4赞 Gerard Roche 8/27/2022 #1

必须有一些正在测试的代码干扰缓冲区。例如,如果被测试的代码打开了一个缓冲区,但由于某种原因没有关闭它,那么你最终会得到一个打开的缓冲区。

以下情况将导致有风险的测试:

class ToTest
{
    public function testMe(): void
    {
        ob_start(); // buffer is never closed
        echo 'test';
    }
}

final class FizzTest extends TestCase
{
    public function testObjectBuffer(): void
    {
        ob_start();
        (new ToTest())->testMe();
        $c = ob_get_clean(); 

        $this->assertSame('test', $c);
    }
}

首先要做的是使用 PHPUnit 输出测试断言

    public function testObjectBuffer(): void
    {
        $this->expectOutputString('test');

        (new ToTest())->testMe();
    }

一旦你这样做了,你就会确定被测试的代码是在某处打开一个缓冲区,而不是关闭它。