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.
Applique les migrations une fois, puis enrobe chaque test dans une transaction avec rollback immédiat à la fin.
Génération de fausses données expressives avec Faker et chaînage de states (User::factory()->admin()).
Assertions sémantiques natives : assertDatabaseHas, assertDatabaseMissing, assertDatabaseCount.
Validation des suppressions logiques avec assertSoftDeleted() et des scopes de requêtes complexes.
Manipulez les entités en base pour observer comment RefreshDatabase et les assertions vérifient l'intégrité des tables.
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,
]);
}); 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();
});