콘솔 테스트
소개
Laravel은 HTTP 테스트를 단순화하는 것 외에도 애플리케이션의 사용자 정의 콘솔 명령어를 테스트하기 위한 간단한 API를 제공합니다.
성공 / 실패 기대
시작하기 위해 Artisan 명령어의 종료 코드에 대한 어설션을 만드는 방법을 살펴보겠습니다. 이를 위해 테스트에서 artisan 메서드를 사용하여 Artisan 명령어를 호출합니다. 그런 다음 assertExitCode 메서드를 사용하여 명령어가 주어진 종료 코드로 완료되었는지 확인합니다.
test('콘솔 명령어', function () { $this->artisan('inspire')->assertExitCode(0);});
/** * 콘솔 명령어를 테스트합니다. */public function test_console_command(): void{ $this->artisan('inspire')->assertExitCode(0);}
주어진 종료 코드로 명령어가 종료되지 않았는지 확인하려면 assertNotExitCode 메서드를 사용할 수 있습니다.
$this->artisan('inspire')->assertNotExitCode(1);
물론, 모든 터미널 명령어는 일반적으로 성공했을 때 상태 코드 0으로 종료되고, 실패했을 때는 0이 아닌 종료 코드로 종료됩니다. 따라서 편의를 위해 assertSuccessful 및 assertFailed 어설션을 사용하여 주어진 명령어가 성공적인 종료 코드로 종료되었는지 또는 그렇지 않은지를 확인할 수 있습니다.
$this->artisan('inspire')->assertSuccessful(); $this->artisan('inspire')->assertFailed();
입력 / 출력 예상
Laravel을 사용하면 expectsQuestion 메서드를 사용하여 콘솔 명령어에 대한 사용자 입력을 쉽게 "모의"할 수 있습니다. 또한 assertExitCode 및 expectsOutput 메서드를 사용하여 콘솔 명령어가 출력할 것으로 예상되는 종료 코드와 텍스트를 지정할 수 있습니다. 예를 들어 다음 콘솔 명령어를 고려해 보세요.
Artisan::command('question', function () { $name = $this->ask('What is your name?'); $language = $this->choice('Which language do you prefer?', [ 'PHP', 'Ruby', 'Python', ]); $this->line('Your name is '.$name.' and you prefer '.$language.'.');});
다음과 같은 테스트로 이 명령어를 테스트할 수 있습니다.
test('console command', function () { $this->artisan('question') ->expectsQuestion('What is your name?', 'Taylor Otwell') ->expectsQuestion('Which language do you prefer?', 'PHP') ->expectsOutput('Your name is Taylor Otwell and you prefer PHP.') ->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.') ->assertExitCode(0);});
/** * 콘솔 명령을 테스트합니다. */public function test_console_command(): void{ $this->artisan('question') ->expectsQuestion('이름이 무엇입니까?', 'Taylor Otwell') ->expectsQuestion('어떤 언어를 선호합니까?', 'PHP') ->expectsOutput('당신의 이름은 Taylor Otwell이고 PHP를 선호합니다.') ->doesntExpectOutput('당신의 이름은 Taylor Otwell이고 Ruby를 선호합니다.') ->assertExitCode(0);}
Laravel Prompts에서 제공하는 search 또는 multisearch 함수를 사용하는 경우, expectsSearch 어설션을 사용하여 사용자의 입력, 검색 결과 및 선택을 모의할 수 있습니다.
test('콘솔 명령', function () { $this->artisan('example') ->expectsSearch('이름이 무엇입니까?', search: 'Tay', answers: [ 'Taylor Otwell', 'Taylor Swift', 'Darian Taylor' ], answer: 'Taylor Otwell') ->assertExitCode(0);});
/** * 콘솔 명령을 테스트합니다. */public function test_console_command(): void{ $this->artisan('example') ->expectsSearch('이름이 무엇입니까?', search: 'Tay', answers: [ 'Taylor Otwell', 'Taylor Swift', 'Darian Taylor' ], answer: 'Taylor Otwell') ->assertExitCode(0);}
또한 doesntExpectOutput 메서드를 사용하여 콘솔 명령이 출력을 생성하지 않는지 어설션할 수 있습니다.
test('콘솔 명령', function () { $this->artisan('example') ->doesntExpectOutput() ->assertExitCode(0);});
/** * 콘솔 명령을 테스트합니다. */public function test_console_command(): void{ $this->artisan('example') ->doesntExpectOutput() ->assertExitCode(0);}
expectsOutputToContain 및 doesntExpectOutputToContain 메서드를 사용하여 출력의 일부에 대해 어설션을 수행할 수 있습니다.
test('콘솔 명령어', function () { $this->artisan('example') ->expectsOutputToContain('Taylor') ->assertExitCode(0);});
/** * 콘솔 명령어를 테스트합니다. */public function test_console_command(): void{ $this->artisan('example') ->expectsOutputToContain('Taylor') ->assertExitCode(0);}
확인 기대값
"예" 또는 "아니오" 답변 형태로 확인을 요구하는 명령어를 작성할 때, expectsConfirmation 메서드를 사용할 수 있습니다:
$this->artisan('module:import') ->expectsConfirmation('이 명령을 정말로 실행하시겠습니까?', 'no') ->assertExitCode(1);
테이블 기대값
만약 명령어에서 Artisan의 table 메서드를 사용하여 정보 테이블을 표시하는 경우, 전체 테이블에 대한 출력 기대값을 작성하는 것은 번거로울 수 있습니다. 대신 expectsTable 메서드를 사용할 수 있습니다. 이 메서드는 테이블 헤더를 첫 번째 인수로, 테이블 데이터를 두 번째 인수로 받습니다:
$this->artisan('users:all') ->expectsTable([ 'ID', '이메일', ], [ ]);
콘솔 이벤트
기본적으로, 애플리케이션 테스트를 실행하는 동안 Illuminate\Console\Events\CommandStarting 및 Illuminate\Console\Events\CommandFinished 이벤트는 디스패치되지 않습니다. 하지만, 테스트 클래스에 Illuminate\Foundation\Testing\WithConsoleEvents 트레이트를 추가하여 특정 테스트 클래스에 대해 이러한 이벤트를 활성화할 수 있습니다:
<?php use Illuminate\Foundation\Testing\WithConsoleEvents; uses(WithConsoleEvents::class); // ...
<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\WithConsoleEvents;use Tests\TestCase; class ConsoleEventTest extends TestCase{ use WithConsoleEvents; // ...}