cspray/stream-buffer-intercept

一个测试工具,用于捕获发送到流资源的输出。

0.2.1 2024-06-15 11:58 UTC

This package is auto-updated.

Last update: 2024-09-15 12:32:06 UTC


README

一个PHP测试工具,旨在捕获流输出并方便编写需要写入流系统的单元测试。

安装

composer require --dev cspray/stream-buffer-intercept

使用指南

在某些情况下,您可能想要对写入流的代码部分进行单元测试。一个例子可能是您正在编写测试来确认发送到 stdoutstderr 的日志消息。 Cspray\StreamBufferIntercept\StreamBuffer 类允许您轻松捕获发送到这些流以及其他流的输出,以轻松断言您的期望。

让我们看看一个简单的代码示例。

<?php declare(strict_types=1);

namespace Cspray\StreamBufferDemo;

use Cspray\StreamBufferIntercept\Buffer;
use Cspray\StreamBufferIntercept\StreamFilter;
use PHPUnit\Framework\TestCase;

class MyLogger {

    private $stdout;
    private $stderr;

    public function __construct($stdout, $stderr) {
        $this->stdout = $stdout;
        $this->stderr = $stderr;
    }
    
    public function log(string $message) : void {
        fwrite($this->stdout, $message);
    }
    
    public function logError(string $message) : void {
        fwrite($this->stderr, $message);
    }

}

class MyLoggerTest extends TestCase {

    private Buffer $stdout;
    
    private Buffer $stderr;
    
    private MyLogger $subject;
    
    protected function setUp() : void{
        StreamFilter::register();
        $this->stdout = StreamFilter::intercept(STDOUT);
        $this->stderr = StreamFilter::intercept(STDERR);
        $this->subject = new MyLogger(STDOUT, STDERR);
    }
    
    protected function tearDown() : void{
        $this->stdout->stopIntercepting();
        $this->stderr->stopIntercepting();
    }
    
    public function testLogMessageSentToStdOutAndNotStdErr() : void {
        $this->subject->log('My stdout output'); 
        
        self::assertSame('My stdout output', $this->stdout->output());
        self::assertSame('', $this->stderr->output());
    }

    public function testLogErrorMessageSentToStdErrAndNotStdOut() : void {
        $this->subject->logError('My stderr output'); 
        
        self::assertSame('My stderr output', $this->stderr->output());
        self::assertSame('', $this->stdout->output());
    }
}