Laravel
Laravel • Module Test • Chapitre 4

Tests des Modèles Eloquent & Base de Données

La manipulation de la base de données est l'un des plus grands atouts de Laravel. Grâce au trait RefreshDatabase (qui isole chaque test dans une transaction avec rollback instantané) et aux Model Factories, vous générez des données de test réalistes et validez les relations Eloquent sans aucune pollution résiduelle.

🔄
RefreshDatabase

Applique les migrations une fois, puis enrobe chaque test dans une transaction avec rollback immédiat à la fin.

🏭
Model Factories

Génération de fausses données expressives avec Faker et chaînage de states (User::factory()->admin()).

🎯
assertDatabaseHas

Assertions sémantiques natives : assertDatabaseHas, assertDatabaseMissing, assertDatabaseCount.

🗑️
Soft Deletes & Scopes

Validation des suppressions logiques avec assertSoftDeleted() et des scopes de requêtes complexes.

Studio Interactif : Cycle Factory & Assertions BDD Eloquent

Manipulez les entités en base pour observer comment RefreshDatabase et les assertions vérifient l'intégrité des tables.

Actions Eloquent :
Table "users" :1 enregistrement(s) (Actif)
Table "posts" rattachée :2 article(s)
// Assertions BDD exécutées dans le test :
// uses(RefreshDatabase::class);
✓ $this->assertDatabaseCount('users', 1);
✓ $this->assertDatabaseCount('posts', 2);
✓ $this->assertDatabaseHas('users', ['email' => 'marie@learnweb.fr']);
✓ Rollback transactionnel instantané (aucun résidu sur disque)
1. Test de Relations Eloquent (hasMany & belongsTo)

Vérifiez qu'un modèle charge correctement ses enfants et respecte les clés étrangères.

use App\Models\User;
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('associe correctement les articles à l auteur', function () {
    $author = User::factory()->create();
    $posts = Post::factory()->count(3)->create(['user_id' => $author->id]);

    expect($author->posts)->toHaveCount(3);
    expect($posts->first()->author->is($author))->toBeTrue();

    $this->assertDatabaseHas('posts', [
        'id' => $posts->first()->id,
        'user_id' => $author->id,
    ]);
});
2. Test de Scopes Locaux Eloquent

Vérifiez que vos méthodes scopePublished() filtrent fidèlement selon la date et le statut.

it('ne retourne que les articles publiés via le scope', function () {
    Post::factory()->create(['published_at' => now()->subDay()]);
    Post::factory()->create(['published_at' => null]); // Brouillon

    $publishedPosts = Post::published()->get();

    expect($publishedPosts)->toHaveCount(1);
    expect($publishedPosts->first()->isPublished())->toBeTrue();
});