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

# Testare pacchetti Laravel con Orchestra Testbench

> Come costruire un ambiente di test per pacchetti Laravel con Orchestra Testbench e verificare service provider, facade, configurazione e database.

## Cos'è Orchestra Testbench

[Orchestra Testbench](https://github.com/orchestral/testbench) è un helper di test Laravel pensato per lo sviluppo di pacchetti. Estendendo `Orchestra\Testbench\TestCase` puoi testare un pacchetto isolato con la stessa esperienza di quando lavori dentro un'applicazione Laravel.

Anche la [documentazione ufficiale sullo sviluppo di pacchetti](/it/advanced/package-development) di Laravel raccomanda Testbench per i test.

```mermaid theme={null}
flowchart TD
    A["PHPUnit / Pest"] --> B["Package TestCase<br>extends Orchestra\\Testbench\\TestCase"]
    B --> C["Registra i service provider<br>tramite getPackageProviders()"]
    C --> D["Avvia un'app Laravel in-memory"]
    D --> E["Verifica le funzionalità del pacchetto"]
```

## Setup

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

  <Step title="Creare un TestCase base">
    ```php theme={null}
    <?php

    namespace Vendor\Package\Tests;

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

    abstract class TestCase extends BaseTestCase
    {
        /**
         * $app è l'istanza dell'applicazione Laravel avviata da Testbench.
         */
        protected function getPackageProviders($app): array
        {
            return [
                PackageServiceProvider::class,
            ];
        }
    }
    ```
  </Step>

  <Step title="Aggiungere all'occorrenza configurazioni e alias">
    In `getPackageAliases()` puoi registrare gli alias dei facade da usare nei test, come faresti in `aliases` di `config/app.php`.

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

    protected function defineEnvironment($app): void
    {
        // qui sovrascrivi le impostazioni per i test
        $app['config']->set('package.enabled', true);
    }
    ```
  </Step>
</Steps>

## Come scrivere i test di base

All'inizio verifica che il service provider sia caricato, che i facade funzionino come previsto e che la configurazione sia applicata.

```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
    {
        // verifica la funzionalità tramite il facade
        $this->assertSame('ok', Package::status());
    }

    public function test_package_config_is_available(): void
    {
        // controlla il valore impostato in defineEnvironment()
        $this->assertTrue(config('package.enabled'));
    }
}
```

## Test di filesystem e database

Nei test che usano un DB configura SQLite in-memory in `defineEnvironment()` e carica le migrazioni da testare.

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

namespace Vendor\Package\Tests;

use Orchestra\Testbench\TestCase as BaseTestCase;

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

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

        // carica le migrazioni del pacchetto
        $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']);
}
```

## Test su più versioni di Laravel

La versione major di Testbench corrisponde alla versione major di Laravel. Per i dettagli consulta la [Version Compatibility ufficiale](https://packages.tools/testbench).

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

Per verificare più versioni in continuo, combina con la matrix di GitHub Actions. Per l'impostazione consulta [Gestire la compatibilità tra versioni dei pacchetti](/it/advanced/package-versioning).

```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"
```

## Riepilogo

Con Testbench puoi verificare il comportamento del pacchetto in condizioni molto vicine a quelle di produzione, senza dover preparare a mano un'app Laravel. Includendo nei test la registrazione dei service provider, la configurazione, i facade e il DB riduci notevolmente i bug che emergono dopo la release.

## Pagine correlate

<Columns cols={2}>
  <Card title="Sviluppo di pacchetti Laravel" icon="box" href="/it/advanced/package-development">
    Rivedi le basi di implementazione di un pacchetto incentrato sui service provider.
  </Card>

  <Card title="Gestire la compatibilità tra versioni dei pacchetti" icon="git-branch" href="/it/advanced/package-versioning">
    Rivedi la strategia di versioning tra Laravel e Testbench e l'operatività della matrix CI.
  </Card>
</Columns>


## Related topics

- [Sviluppare pacchetti con Testbench Workbench](/it/advanced/package-workbench.md)
- [CHANGELOG e release management dei pacchetti](/it/advanced/package-changelog.md)
- [Analisi statica dei pacchetti (PHPStan / Larastan)](/it/advanced/package-static-analysis.md)
- [GeneratorCommand — implementare comandi `make:` personalizzati](/it/advanced/generator-command.md)
- [Sviluppo di pacchetti Laravel](/it/advanced/package-development.md)
