イントロダクション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.'.');
});
このコマンドは、expectsQuestion
、expectsOutput
、doesntExpectOutput
、expectsOutputToContain
、doesntExpectOutputToContain
、assertExitCode
メソッドを利用する以下の例でテストできます。You may test this command with
the following test which utilizes the
expectsQuestion
,
expectsOutput
,
doesntExpectOutput
,
expectsOutputToContain
,
doesntExpectOutputToContain
, and
assertExitCode
methods:
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.')
->expectsOutputToContain('Taylor Otwell')
->doesntExpectOutputToContain('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.')
->expectsOutputToContain('Taylor Otwell')
->doesntExpectOutputToContain('you prefer Ruby')
->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);
}
確認の期待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;
// ...
}