イントロダクションIntroduction
Laravelは、HTTPテストを簡素化することに加え、アプリケーションのカスタムコンソールコマンドをテストするためのシンプルなAPIも提供します。In addition to simplifying HTTP testing, Laravel provides a simple API for testing your application's custom console commands[/docs/{{version}}/artisan].
実行成功/失敗のアサートSuccess / Failure Expectations
手始めに、Artisanコマンドの終了コードをアサートする方法を見てみましょう。それには、artisan
メソッドを使用して、テストからArtisanコマンドを呼び出します。それから、assertExitCode
メソッドを使用して、指定した終了コードでコマンドが完了することをアサートします。To get started, let's explore how to make assertions regarding an Artisan command's exit code. To accomplish this, we will use the artisan
method to invoke an Artisan command from our test. Then, we will use the assertExitCode
method to assert that the command completed with a given exit code:
test('console command', function () {
$this->artisan('inspire')->assertExitCode(0);
});
/**
* コンソールコマンドのテスト
*/
public function test_console_command(): void
{
$this->artisan('inspire')->assertExitCode(0);
}
コマンドが指定コードで終了しないことをアサートするには、assertNotExitCode
メソッドを使用します。You may use the assertNotExitCode
method to assert that the command did not exit with a given exit code:
$this->artisan('inspire')->assertNotExitCode(1);
もちろん、すべてのターミナルコマンドは通常、成功した場合に0
のステータスコードで終了し、成功しなかった場合には0以外の終了コードで終了します。したがって、使い勝手が良いようにassertSuccessful
とassertFailed
のアサーションを利用し、コマンドが成功の終了コードで終了した/終了しなかったことをアサートできます。Of course, all terminal commands typically exit with a status code of 0
when they are successful and a non-zero exit code when they are not successful. Therefore, for convenience, you may utilize the assertSuccessful
and assertFailed
assertions to assert that a given command exited with a successful exit code or not:
$this->artisan('inspire')->assertSuccessful();
$this->artisan('inspire')->assertFailed();
入力/出力の期待値Input / Output Expectations
LaravelでexpectsQuestion
メソッドを使用すれば、コンソールコマンドのユーザー入力を簡単に「モック」できます。さらに、終了コードをassertExitCode
メソッドで、コンソールコマンドに期待する出力をexpectsOutput
メソッドでそれぞれ指定することもできます。Laravel allows you to easily "mock" user input for your console commands using the expectsQuestion
method. In addition, you may specify the exit code and text that you expect to be output by the console command using the assertExitCode
and expectsOutput
methods. For example, consider the following console command:
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.'.');
});
このコマンドは以下のように、テストしてください。You may test this command with the following test:
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('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);
}
Laravel Promptsが提供する、search
やmultisearch
関数を使用している場合、expectsSearch
アサートを使用してユーザーの入力、検索結果、選択をモックできます。If you are utilizing the search
or multisearch
functions provided by Laravel Prompts[/docs/{{version}}/prompts], you may use the expectsSearch
assertion to mock the user's input, search results, and selection:
test('console command', function () {
$this->artisan('example')
->expectsSearch('What is your name?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
});
/**
* コンソールコマンドのテスト
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsSearch('What is your name?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
}
また、doesntExpectOutput
メソッドを使い、コンソールコマンドが出力を生成しないこともアサートできます。You may also assert that a console command does not generate any output using the doesntExpectOutput
method:
test('console command', function () {
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
});
/**
* コンソールコマンドのテスト
*/
public function test_console_command(): void
{
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
}
expectsOutputToContain
とdoesntExpectOutputToContain
メソッドは、出力の一部に対してアサートするために使います。The expectsOutputToContain
and doesntExpectOutputToContain
methods may be used to make assertions against a portion of the output:
test('console command', function () {
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
});
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
}
確認の期待Confirmation Expectations
「はい」または「いいえ」の回答の形式で確認を期待するコマンドを作成する場合は、expectsConfirmation
メソッドを使用できます。When writing a command which expects confirmation in the form of a "yes" or "no" answer, you may utilize the expectsConfirmation
method:
$this->artisan('module:import')
->expectsConfirmation('Do you really wish to run this command?', 'no')
->assertExitCode(1);
テーブルの期待Table Expectations
コマンドがArtisanのtable
メソッドを使用して情報のテーブルを表示する場合、テーブル全体の出力期待値を書き込むのは面倒な場合があります。代わりに、expectsTable
メソッドを使用できます。このメソッドは、テーブルのヘッダを最初の引数として受け入れ、テーブルのデータを2番目の引数として受け入れます。If your command displays a table of information using Artisan's table
method, it can be cumbersome to write output expectations for the entire table. Instead, you may use the expectsTable
method. This method accepts the table's headers as its first argument and the table's data as its second argument:
$this->artisan('users:all')
->expectsTable([
'ID',
'Email',
], [
[1, 'taylor@example.com'],
[2, 'abigail@example.com'],
]);
コンソールイベントConsole Events
デフォルトでは、アプリケーションのテスト実行中は、Illuminate\Console\Events\CommandStarting
とIlluminate\Console\Events\CommandFinished
はデフォルトでディスパッチしません。しかし、テストクラスへIlluminate\Foundation\Testing\WithConsoleEvents
トレイトを追加すれば、これらのイベントを有効にできます:By default, the Illuminate\Console\Events\CommandStarting
and Illuminate\Console\Events\CommandFinished
events are not dispatched while running your application's tests. However, you can enable these events for a given test class by adding the Illuminate\Foundation\Testing\WithConsoleEvents
trait to the class:
<?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;
// ...
}