> ## 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-packages testen met Orchestra Testbench

> Hoe je met Orchestra Testbench een testomgeving voor Laravel-packages opzet en service providers, facades, configuratie en de database verifieert.

## Wat is Orchestra Testbench?

[Orchestra Testbench](https://github.com/orchestral/testbench) is een Laravel-testhelper voor packageontwikkeling. Als je van `Orchestra\Testbench\TestCase` erft, kun je een package op zichzelf testen alsof je binnen een Laravel-applicatie zit.

Ook in de gids over [packageontwikkeling](/nl/advanced/package-development) wordt aangeraden om Testbench te gebruiken voor packagetests.

```mermaid theme={null}
flowchart TD
    A["PHPUnit / Pest"] --> B["Package TestCase<br>extends Orchestra\\Testbench\\TestCase"]
    B --> C["Service providers registreren<br>via getPackageProviders()"]
    C --> D["In-memory Laravel-app starten"]
    D --> E["De functionaliteit van het package verifiëren"]
```

## Setup

<Steps>
  <Step title="Installeer Testbench">
    ```bash theme={null}
    composer require --dev orchestra/testbench
    ```
  </Step>

  <Step title="Maak een basis-TestCase">
    ```php theme={null}
    <?php

    namespace Vendor\Package\Tests;

    use Orchestra\Testbench\TestCase as BaseTestCase;
    use Vendor\Package\PackageServiceProvider;

    abstract class TestCase extends BaseTestCase
    {
        /**
         * $app is de door Testbench gestarte Laravel-applicatie-instantie.
         */
        protected function getPackageProviders($app): array
        {
            return [
                PackageServiceProvider::class,
            ];
        }
    }
    ```
  </Step>

  <Step title="Voeg indien nodig configuratie of aliassen toe">
    Met `getPackageAliases()` registreer je, net als bij `aliases` in `config/app.php`, de facade-aliassen die je tijdens de tests gebruikt.

    ```php theme={null}
    protected function getPackageAliases($app): array
    {
        return [
            'Package' => \Vendor\Package\Facades\Package::class,
        ];
    }

    protected function defineEnvironment($app): void
    {
        // Overschrijf hier de testconfiguratie
        $app['config']->set('package.enabled', true);
    }
    ```
  </Step>
</Steps>

## Basistests schrijven

Controleer als eerste of de service provider geladen is, of de facade werkt zoals verwacht en of de configuratie is doorgevoerd.

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

namespace Vendor\Package\Tests\Feature;

use Vendor\Package\Facades\Package;
use Vendor\Package\PackageServiceProvider;
use Vendor\Package\Tests\TestCase;

class PackageBootstrapTest extends TestCase
{
    public function test_service_provider_is_registered(): void
    {
        $this->assertTrue($this->app->providerIsLoaded(PackageServiceProvider::class));
    }

    public function test_facade_returns_expected_value(): void
    {
        // Verifieer de functionaliteit via de facade
        $this->assertSame('ok', Package::status());
    }

    public function test_package_config_is_available(): void
    {
        // Controleer de waarde die in defineEnvironment() is ingesteld
        $this->assertTrue(config('package.enabled'));
    }
}
```

## Bestandssysteem- en databasetests

Voor tests die een database gebruiken, configureer je in `defineEnvironment()` een in-memory SQLite en laad je de migrations die je wilt testen.

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

namespace Vendor\Package\Tests;

use Orchestra\Testbench\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    protected function defineEnvironment($app): void
    {
        // Gebruik een in-memory SQLite-database
        $app['config']->set('database.default', 'testing');
        $app['config']->set('database.connections.testing', [
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
        ]);
    }

    protected function setUp(): void
    {
        parent::setUp();

        // Laad de migrations van het package
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
    }
}
```

```php theme={null}
public function test_it_persists_data(): void
{
    \DB::table('widgets')->insert(['name' => 'test']);

    $this->assertDatabaseHas('widgets', ['name' => 'test']);
}
```

## Testen op meerdere Laravel-versies

De majorversie van Testbench correspondeert met de majorversie van Laravel. Zie de officiële [Version Compatibility](https://packages.tools/testbench) voor details.

| Laravel | Testbench |
| ------- | --------- |
| 12.x    | 10.x      |
| 13.x    | 11.x      |

Als je meerdere versies continu wilt verifiëren, combineer je dit met een GitHub Actions-matrix. Zie [Versiecompatibiliteit van packages beheren](/nl/advanced/package-versioning) voor de ontwerpgedachte.

```yaml theme={null}
strategy:
  fail-fast: false
  matrix:
    php: [8.3, 8.4]
    laravel: ["^12.0", "^13.0"]
    include:
      - laravel: "^13.0"
        testbench: "^11.0"
      - laravel: "^12.0"
        testbench: "^10.0"
```

## Samenvatting

Met Testbench kun je het gedrag van je package verifiëren op een manier die dicht bij productie ligt, zonder handmatig een Laravel-app op te zetten. Door service-providerregistratie, configuratie, facades en de database allemaal in je tests op te nemen, verminder je problemen na een release aanzienlijk.

## Gerelateerde pagina's

<Columns cols={2}>
  <Card title="Laravel-packages ontwikkelen" icon="box" href="/nl/advanced/package-development">
    Bekijk de basis van een package-implementatie rond service providers.
  </Card>

  <Card title="Versiecompatibiliteit van packages beheren" icon="git-branch" href="/nl/advanced/package-versioning">
    Bekijk de versiestrategie voor Laravel en Testbench en het beheer van de CI-matrix.
  </Card>
</Columns>


## Related topics

- [Packageontwikkeling met Testbench Workbench](/nl/advanced/package-workbench.md)
- [Statische analyse van packages (PHPStan / Larastan)](/nl/advanced/package-static-analysis.md)
- [CHANGELOG en releasebeheer voor packages](/nl/advanced/package-changelog.md)
- [De interne structuur van package discovery](/nl/advanced/package-discovery.md)
- [GeneratorCommand — eigen make: commando's implementeren](/nl/advanced/generator-command.md)
