> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 主控台測試

> 學習如何在 Laravel 中測試 Artisan 指令（輸入 / 輸出的期待值、離開代碼驗證、主控台事件驗證）。

# 主控台測試

在 Laravel 中，你可以簡潔地為 Artisan 指令撰寫包含輸入與輸出的測試。

<Info>
  本頁對應到 Laravel 最新的主控台測試 API，並涵蓋驗證 Laravel Prompts 搜尋輸入的 `expectsSearch`。
</Info>

## 簡介

使用 `artisan` 方法執行指令，並串接期待值進行驗證。

<Tabs>
  <Tab title="Pest">
    ```php theme={null}
    test('question 指令', 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);
    });
    ```
  </Tab>

  <Tab title="PHPUnit">
    ```php theme={null}
    public function test_question_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);
    }
    ```
  </Tab>
</Tabs>

```mermaid theme={null}
flowchart TD
    A[以 artisan 執行指令] --> B[定義輸入期待值]
    B --> C[驗證輸出或表格]
    C --> D[驗證離開狀態]
```

## 成功 / 失敗的斷言

可透過檢查離開狀態，判斷指令是否成功或失敗。

```php theme={null}
$this->artisan('inspire')->assertExitCode(0);
$this->artisan('inspire')->assertSuccessful();
$this->artisan('inspire')->assertFailed();
```

## 輸入 / 輸出的期待值

### 輸入的期待值

可對詢問輸入與搜尋輸入模擬使用者操作。

```php theme={null}
// 同時模擬詢問輸入與搜尋輸入
$this->artisan('example')
    ->expectsQuestion('What is your name?', 'Taylor Otwell')
    ->expectsSearch('What is your name?', search: 'Tay', answers: [
        'Taylor Otwell',
        'Taylor Swift',
        'Darian Taylor',
    ], answer: 'Taylor Otwell')
    ->assertExitCode(0);
```

### 輸出的期待值

可驗證輸出字串的完全比對、部分比對，或表格顯示。

```php theme={null}
// 確認只顯示期待的輸出
$this->artisan('users:all')
    ->expectsOutput('The expected output')
    ->doesntExpectOutput('Unexpected output')
    ->expectsOutputToContain('expected')
    ->expectsTable([
        'ID',
        'Email',
    ], [
        [1, 'taylor@example.com'],
        [2, 'abigail@example.com'],
    ])
    ->assertExitCode(0);
```

## 確認的期待值

Yes / No 的確認提示可用 `expectsConfirmation`。

```php theme={null}
$this->artisan('module:import')
    ->expectsConfirmation('Do you really wish to run this command?', 'no')
    ->assertExitCode(1);
```

## 主控台事件

在測試執行時，預設不會觸發 `CommandStarting` / `CommandFinished` 事件。

若測試類別需要驗證這些事件，請加入 `WithConsoleEvents`。

```php theme={null}
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\WithConsoleEvents;
use Tests\TestCase;

class ConsoleEventTest extends TestCase
{
    use WithConsoleEvents;
}
```

<Tip>
  建議只在必要的測試中使用 `WithConsoleEvents`，可維持一般測試的執行速度。
</Tip>


## Related topics

- [瀏覽器測試（Dusk）](/zh-TW/dusk.md)
- [Laravel Prompts](/zh-TW/prompts.md)
- [Artisan Console](/zh-TW/artisan.md)
- [Process](/zh-TW/processes.md)
- [測試](/zh-TW/packages/laravel-bluesky/testing.md)
