CLI 명령 테스트

MockInputOutput 사용

Added in version 4.5.0.

MockInputOutput

MockInputOutputCLI::prompt(), CLI::wait(), CLI::input()과 같이 사용자 입력이 필요한 명령에 대한 테스트를 작성하는 쉬운 방법을 제공합니다.

테스트 실행 중에 InputOutput 클래스를 MockInputOutput으로 교체하여 입력과 출력을 캡처할 수 있습니다.

참고

MockInputOutput을 사용할 때는 StreamFilterTrait, CITestStreamFilter, PhpStreamWrapper를 사용할 필요가 없습니다.

헬퍼 메서드

getOutput(?int $index = null): string

출력을 가져옵니다.

  • $io->getOutput()처럼 호출하면 전체 출력 문자열을 반환합니다.

  • 0 또는 양수를 지정하면 출력 배열의 해당 항목을 반환합니다. 각 항목에는 CLI::fwrite() 호출의 출력이 담겨 있습니다.

  • 음수 -n을 지정하면 출력 배열의 마지막에서 n번째 항목을 반환합니다.

getOutputs(): array

출력 배열을 반환합니다. 각 항목에는 CLI::fwrite() 호출의 출력이 담겨 있습니다.

사용 방법

  • CLI::setInputOutput()MockInputOutput 인스턴스를 CLI 클래스에 설정할 수 있습니다.

  • CLI::resetInputOutput()CLI 클래스의 InputOutput 인스턴스를 초기화합니다.

  • MockInputOutput::setInputs()는 사용자 입력 배열을 설정합니다.

  • MockInputOutput::getOutput()은 명령 출력을 가져옵니다.

다음 테스트 코드는 spark db:table 명령을 테스트하기 위한 것입니다:

<?php

use CodeIgniter\CLI\CLI;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\Mock\MockInputOutput;

final class DbTableTest extends CIUnitTestCase
{
    use DatabaseTestTrait;

    protected $migrateOnce = true;

    public function testDbTable(): void
    {
        // Set MockInputOutput to CLI.
        $io = new MockInputOutput();
        CLI::setInputOutput($io);

        // User will input "a" (invalid value) and "0".
        $io->setInputs(['a', '0']);

        command('db:table');

        // Get the whole output string.
        $output = $io->getOutput();

        $expected = 'Which table do you want to see? [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: a';
        $this->assertStringContainsString($expected, $output);

        $expected = 'Data of Table "db_migrations":';
        $this->assertStringContainsString($expected, $output);

        // Remove MockInputOutput.
        CLI::resetInputOutput();
    }
}

MockInputOutput 없이 사용

CLI 출력 테스트

StreamFilterTrait

Added in version 4.3.0.

StreamFilterTrait은 이러한 헬퍼 메서드의 대안을 제공합니다.

테스트하기 어려운 것들을 테스트해야 할 수도 있습니다. 때로는 PHP의 STDOUT이나 STDERR 같은 스트림을 캡처하는 것이 도움이 될 수 있습니다. StreamFilterTrait은 원하는 스트림의 출력을 캡처하는 데 도움을 줍니다.

사용 방법
  • StreamFilterTrait::getStreamFilterBuffer()는 버퍼에서 캡처된 데이터를 가져옵니다.

  • StreamFilterTrait::resetStreamFilterBuffer()는 캡처된 데이터를 초기화합니다.

테스트 케이스 내에서 이를 사용하는 예시:

<?php

namespace Tests;

use CodeIgniter\CLI\CLI;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\StreamFilterTrait;

final class SomeTest extends CIUnitTestCase
{
    use StreamFilterTrait;

    public function testSomeOutput(): void
    {
        CLI::write('first.');

        $this->assertSame("\nfirst.\n", $this->getStreamFilterBuffer());

        $this->resetStreamFilterBuffer();

        CLI::write('second.');

        $this->assertSame("second.\n", $this->getStreamFilterBuffer());
    }
}

StreamFilterTrait에는 자동으로 호출되는 설정자(configurator)가 있습니다. 테스트 트레이트를 참조하십시오.

테스트에서 setUp() 또는 tearDown() 메서드를 오버라이드하는 경우, StreamFilterTrait을 구성하기 위해 각각 parent::setUp()parent::tearDown() 메서드를 호출해야 합니다.

CITestStreamFilter

CITestStreamFilter는 수동/단독 사용을 위한 것입니다.

하나의 테스트에서만 스트림을 캡처해야 하는 경우, StreamFilterTrait 트레이트를 사용하는 대신 스트림에 필터를 수동으로 추가할 수 있습니다.

사용 방법
  • CITestStreamFilter::registration() 필터 등록.

  • CITestStreamFilter::addOutputFilter() 출력 스트림에 필터 추가.

  • CITestStreamFilter::addErrorFilter() 에러 스트림에 필터 추가.

  • CITestStreamFilter::removeOutputFilter() 출력 스트림에서 필터 제거.

  • CITestStreamFilter::removeErrorFilter() 에러 스트림에서 필터 제거.

<?php

namespace Tests;

use CodeIgniter\CLI\CLI;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\Filters\CITestStreamFilter;

final class SomeTest extends CIUnitTestCase
{
    public function testSomeOutput(): void
    {
        CITestStreamFilter::registration();
        CITestStreamFilter::addOutputFilter();

        CLI::write('first.');

        CITestStreamFilter::removeOutputFilter();
    }
}

CLI 입력 테스트

PhpStreamWrapper

Added in version 4.3.0.

PhpStreamWrapperCLI::prompt(), CLI::wait(), CLI::input()과 같이 사용자 입력이 필요한 메서드에 대한 테스트를 작성하는 방법을 제공합니다.

참고

PhpStreamWrapper는 스트림 래퍼(stream wrapper) 클래스입니다. PHP의 스트림 래퍼를 모른다면 PHP 매뉴얼의 streamWrapper 클래스를 참조하십시오.

사용 방법
  • PhpStreamWrapper::register() PhpStreamWrapperphp 프로토콜에 등록합니다.

  • PhpStreamWrapper::restore() php 프로토콜 래퍼를 PHP 내장 래퍼로 복원합니다.

  • PhpStreamWrapper::setContent() 입력 데이터를 설정합니다.

중요

PhpStreamWrapper는 php://stdin 테스트 전용으로 설계되었습니다. 하지만 등록하면 php://stdout, php://stderr, php://memory와 같은 모든 php 프로토콜 스트림을 처리합니다. 따라서 PhpStreamWrapper는 필요할 때만 등록/해제하는 것을 강력히 권장합니다. 그렇지 않으면 등록된 동안 다른 PHP 내장 스트림에 간섭할 수 있습니다.

테스트 케이스 내에서 이를 사용하는 예시:

<?php

namespace Tests;

use CodeIgniter\CLI\CLI;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\PhpStreamWrapper;

final class SomeTest extends CIUnitTestCase
{
    public function testPrompt(): void
    {
        // Register the PhpStreamWrapper.
        PhpStreamWrapper::register();

        // Set the user input to 'red'. It will be provided as `php://stdin` output.
        $expected = 'red';
        PhpStreamWrapper::setContent($expected);

        $output = CLI::prompt('What is your favorite color?');

        $this->assertSame($expected, $output);

        // Restore php protocol wrapper.
        PhpStreamWrapper::restore();
    }
}