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

标签 phpunit output-buffering

我有一段代码要测试:

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

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

最佳答案

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

以下将导致风险测试:

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 output testing assertions :

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

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

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

关于Phpunit,测试代码或测试代码没有(仅)关闭自己的输出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73510300/

相关文章:

PHPUnit assertEquals 严格类型检查

php - 将输出流式传输到文件和浏览器

php - die() 是否执行 ob_end_flush()?

php - Symfony 如何加载端到端测试的测试环境?

unit-testing - 让 phpunit 与 zend framework2 一起工作

php - ob_get_clean,只工作两次

PHP:抑制函数内的输出?

PHP:输出缓冲区回调不改变输出

php - 单元测试包含 DateTime ("now"的函数)

php - 为什么我会收到错误 Failed asserting that Response Object (...) is an instance of class "RedirectResponse"?