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

# Databasetests

> Hoe je efficiënt databasetests schrijft in Laravel met RefreshDatabase, seeders, factories en speciale assertions

## Aan de slag

Laravel biedt standaard voorzieningen om functionaliteit die de database gebruikt veilig en snel te verifiëren. Door database-reset-traits, modelfactories, seeders en speciale assertions te combineren, maak je tests die niet snel breken.

Begin in de basis met `RefreshDatabase`. In veel gevallen behoud je daarmee de onafhankelijkheid van je tests sneller dan met een volledige reset.

## De database na elke test resetten

Gebruik de database-reset-traits van Laravel om te voorkomen dat data van een eerdere test de volgende test beïnvloedt.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use Illuminate\Foundation\Testing\RefreshDatabase;

  uses(RefreshDatabase::class);

  test('basisvoorbeeld', function () {
      $response = $this->get('/');

      $response->assertOk();
  });
  ```

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

  namespace Tests\Feature;

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

  class ExampleTest extends TestCase
  {
      use RefreshDatabase;

      public function test_basic_example(): void
      {
          $response = $this->get('/');

          $response->assertOk();
      }
  }
  ```
</CodeGroup>

`RefreshDatabase` bepaalt of het schema up-to-date is. Zo ja, dan wordt de test in een transactie uitgevoerd; zo niet, dan worden eerst de migraties uitgevoerd.

```mermaid theme={null}
flowchart TD
    A[Test met RefreshDatabase start] --> B{Is het schema up-to-date?}
    B -- Ja --> C[Uitvoeren in een DB-transactie]
    B -- Nee --> D[Migraties uitvoeren]
    D --> E[Test uitvoeren]
    C --> E[Test uitvoeren]
    E --> F[Rollback / status resetten]
```

Wil je niet de transactie-aanpak, maar elke keer een volledige reset, gebruik dan een van de volgende traits.

| Trait                | Gedrag                                                                  | Wanneer te gebruiken                                                     |
| -------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `RefreshDatabase`    | Transactie als het schema up-to-date is, migraties alleen wanneer nodig | Meestal je eerste keuze                                                  |
| `DatabaseMigrations` | Voert bij elke test de migraties uit                                    | Als je elke keer de volledige migratielevenscyclus wilt doorlopen        |
| `DatabaseTruncation` | Initialiseert door tabellen te TRUNCATEn                                | Als je in een omgeving waar transacties niet passen alles wilt leegmaken |

## Modelfactories

Wanneer je data voorbereidt vóór een test, kun je met modelfactories beknopt Eloquent-modellen genereren.

Zie [Eloquent-factories](/nl/eloquent-factories) voor details over factory-definities, states en relaties.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

  test('model kan worden aangemaakt', function () {
      $user = User::factory()->create();

      expect($user->exists)->toBeTrue();
  });
  ```

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

  namespace Tests\Feature;

  use App\Models\User;
  use Tests\TestCase;

  class UserFactoryTest extends TestCase
  {
      public function test_models_can_be_instantiated(): void
      {
          $user = User::factory()->create();

          $this->assertTrue($user->exists);
      }
  }
  ```
</CodeGroup>

## Seeders uitvoeren

Wil je tijdens een test data inladen, gebruik dan `seed()`. Zonder argument wordt de `DatabaseSeeder` uitgevoerd, met argument een specifieke seeder (of een array).

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use Database\Seeders\OrderStatusSeeder;
  use Database\Seeders\TransactionStatusSeeder;
  use Illuminate\Foundation\Testing\RefreshDatabase;

  uses(RefreshDatabase::class);

  test('bestellingen kunnen worden aangemaakt', function () {
      $this->seed();

      $this->seed(OrderStatusSeeder::class);

      $this->seed([
          OrderStatusSeeder::class,
          TransactionStatusSeeder::class,
      ]);

      // ...
  });
  ```

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

  namespace Tests\Feature;

  use Database\Seeders\OrderStatusSeeder;
  use Database\Seeders\TransactionStatusSeeder;
  use Illuminate\Foundation\Testing\RefreshDatabase;
  use Tests\TestCase;

  class OrderTest extends TestCase
  {
      use RefreshDatabase;

      public function test_orders_can_be_created(): void
      {
          $this->seed();

          $this->seed(OrderStatusSeeder::class);

          $this->seed([
              OrderStatusSeeder::class,
              TransactionStatusSeeder::class,
          ]);

          // ...
      }
  }
  ```
</CodeGroup>

Wil je bij alle tests die `RefreshDatabase` gebruiken elke keer automatisch seeden, voeg dan het `#[Seed]`-attribuut toe aan je basistestklasse.

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

namespace Tests;

use Illuminate\Foundation\Testing\Attributes\Seed;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

#[Seed]
abstract class TestCase extends BaseTestCase
{
}
```

Wil je alleen een specifieke seeder automatisch uitvoeren, gebruik dan `#[Seeder(...)]`.

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

namespace Tests\Feature;

use Database\Seeders\OrderStatusSeeder;
use Illuminate\Foundation\Testing\Attributes\Seeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

#[Seeder(OrderStatusSeeder::class)]
class OrderStatusTest extends TestCase
{
    use RefreshDatabase;
}
```

## Beschikbare assertions

Laravel biedt speciale database-assertions die zowel in Pest als PHPUnit werken.

### `assertDatabaseCount`

Controleert dat het aantal records in een tabel overeenkomt met de verwachte waarde.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseCount('users', 5);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseCount('users', 5);
  ```
</CodeGroup>

### `assertDatabaseEmpty`

Controleert dat een tabel leeg is.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseEmpty('users');
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseEmpty('users');
  ```
</CodeGroup>

### `assertDatabaseHas`

Controleert dat er een record bestaat dat aan de opgegeven voorwaarden voldoet.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseHas('users', [
      'email' => 'sally@example.com',
  ]);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseHas('users', [
      'email' => 'sally@example.com',
  ]);
  ```
</CodeGroup>

### `assertDatabaseMissing`

Controleert dat er geen record bestaat dat aan de opgegeven voorwaarden voldoet.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseMissing('users', [
      'email' => 'sally@example.com',
  ]);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseMissing('users', [
      'email' => 'sally@example.com',
  ]);
  ```
</CodeGroup>

### `assertSoftDeleted`

Controleert dat het betreffende Eloquent-model soft-deleted is.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertSoftDeleted($user);
  ```

  ```php PHPUnit theme={null}
  $this->assertSoftDeleted($user);
  ```
</CodeGroup>

### `assertNotSoftDeleted`

Controleert dat het betreffende Eloquent-model niet soft-deleted is.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertNotSoftDeleted($user);
  ```

  ```php PHPUnit theme={null}
  $this->assertNotSoftDeleted($user);
  ```
</CodeGroup>

### `assertModelExists`

Controleert dat het opgegeven model (of de modelcollectie) in de database bestaat.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

  $user = User::factory()->create();

  $this->assertModelExists($user);
  ```

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

  use App\Models\User;

  $user = User::factory()->create();

  $this->assertModelExists($user);
  ```
</CodeGroup>

### `assertModelMissing`

Controleert dat het opgegeven model (of de modelcollectie) niet in de database bestaat.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

  $user = User::factory()->create();
  $user->delete();

  $this->assertModelMissing($user);
  ```

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

  use App\Models\User;

  $user = User::factory()->create();
  $user->delete();

  $this->assertModelMissing($user);
  ```
</CodeGroup>

### `expectsDatabaseQueryCount`

Legt aan het begin van een test het exacte totale aantal databasequeries vast dat uitgevoerd zal worden. Als het werkelijke aantal niet overeenkomt, faalt de test.

<CodeGroup>
  ```php Pest theme={null}
  $this->expectsDatabaseQueryCount(5);

  // Test...
  ```

  ```php PHPUnit theme={null}
  $this->expectsDatabaseQueryCount(5);

  // Test...
  ```
</CodeGroup>


## Related topics

- [Laravel-packages testen met Orchestra Testbench](/nl/advanced/package-testing.md)
