CLI 명령 테스트
MockInputOutput 사용
Added in version 4.5.0.
MockInputOutput
MockInputOutput은 CLI::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.
PhpStreamWrapper은 CLI::prompt(), CLI::wait(), CLI::input()과 같이 사용자 입력이 필요한 메서드에 대한 테스트를 작성하는 방법을 제공합니다.
참고
PhpStreamWrapper는 스트림 래퍼(stream wrapper) 클래스입니다. PHP의 스트림 래퍼를 모른다면 PHP 매뉴얼의 streamWrapper 클래스를 참조하십시오.
사용 방법
PhpStreamWrapper::register()PhpStreamWrapper를php프로토콜에 등록합니다.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();
}
}