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

# Konsolentests

> Erfahren Sie, wie Sie in Laravel Artisan-Befehle testen können, einschließlich erwarteter Ein- und Ausgaben, der Prüfung von Exit-Codes und der Validierung von Konsolen-Events.

# Konsolentests

In Laravel können Sie Tests für Artisan-Befehle einschließlich Ein- und Ausgaben knapp und übersichtlich schreiben.

<Info>
  Diese Seite ist auf die aktuelle Konsolentest-API von Laravel abgestimmt und behandelt auch `expectsSearch` zur Prüfung der Sucheingabe von Laravel Prompts.
</Info>

## Einführung

Sie führen einen Befehl mit der Methode `artisan` aus und prüfen die Erwartungen über Method Chaining.

<Tabs>
  <Tab title="Pest">
    ```php theme={null}
    test('question command', function () {
        // Benutzereingaben und Ausgaben der Reihe nach prüfen
        $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
    {
        // Interaktiven Ablauf des Befehls überprüfen
        $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[Befehl mit artisan ausführen] --> B[Eingabe-Erwartungen definieren]
    B --> C[Ausgabe oder Tabelle prüfen]
    C --> D[Exit-Status prüfen]
```

## Erfolgs- / Fehler-Assertions

Über den Exit-Status können Sie entscheiden, ob der Befehl erfolgreich war oder fehlgeschlagen ist.

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

## Erwartete Ein- / Ausgaben

### Eingabe-Erwartungen

Sie können Benutzeraktionen für Fragen und Sucheingaben mocken.

```php theme={null}
// Sowohl Fragen- als auch Sucheingaben mocken
$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);
```

### Ausgabe-Erwartungen

Sie können exakte Übereinstimmung, Teilstring-Übereinstimmung und Tabellenausgaben prüfen.

```php theme={null}
// Prüfen, dass nur die erwartete Ausgabe angezeigt wird
$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);
```

## Bestätigungs-Erwartungen

Für Ja/Nein-Bestätigungsprompts verwenden Sie `expectsConfirmation`.

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

## Konsolen-Events

Standardmäßig werden `CommandStarting` und `CommandFinished` bei Testausführung nicht ausgelöst.

Fügen Sie in Testklassen, in denen Sie Events prüfen möchten, den Trait `WithConsoleEvents` hinzu.

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

namespace Tests\Feature;

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

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

<Tip>
  Wenn Sie `WithConsoleEvents` nur in den Tests einsetzen, in denen Sie es tatsächlich benötigen, bleibt die normale Testgeschwindigkeit erhalten.
</Tip>
