Tests — vérifier que tout fonctionne
Tests unitaires, feature tests et factories
Concepts Théoriques
Vous avez construit SunuLearn avec des formations, de l'authentification, des formulaires, une API. Comment être sûr que tout fonctionne après une modification ? Les tests automatisés vérifient votre code en quelques secondes.
Laravel utilise Pest (installé avec Breeze) — une syntaxe simple et expressive pour les tests.
Types de tests
- Feature tests — testent une fonctionnalité complète (visiter une page, soumettre un formulaire, vérifier la réponse). C'est ce qu'on utilise le plus.
- Unit tests — testent une fonction isolée (un calcul, une méthode d'un modèle).
Un premier test
php artisan make:test FormationTest// tests/Feature/FormationTest.php
use App\Models\Formation;
use App\Models\Category;
it('affiche la page catalogue', function () {
$response = $this->get('/formations');
$response->assertStatus(200);
});
it('affiche une formation par son slug', function () {
$formation = Formation::factory()->create(['is_published' => true]);
$response = $this->get("/formations/{$formation->slug}");
$response->assertStatus(200);
$response->assertSee($formation->title);
});
it('retourne 404 pour une formation inexistante', function () {
$response = $this->get('/formations/slug-qui-nexiste-pas');
$response->assertStatus(404);
});Tester l'authentification
use App\Models\User;
it('redirige vers login si non connecté', function () {
$this->get('/dashboard')
->assertRedirect('/login');
});
it('affiche le dashboard si connecté', function () {
$user = User::factory()->create();
$this->actingAs($user)
->get('/dashboard')
->assertStatus(200)
->assertSee($user->name);
});actingAs($user) simule une connexion — pas besoin de formulaire.
Tester un formulaire
it('crée une formation via le formulaire', function () {
$user = User::factory()->create(['role' => 'teacher']);
$category = Category::factory()->create();
$this->actingAs($user)
->post('/teacher/formations', [
'title' => 'Test Formation',
'slug' => 'test-formation',
'short_description' => 'Une description de test',
'category_id' => $category->id,
'level' => 'debutant',
])
->assertRedirect();
$this->assertDatabaseHas('formations', [
'title' => 'Test Formation',
'slug' => 'test-formation',
]);
});
it('refuse un formulaire avec des données invalides', function () {
$user = User::factory()->create(['role' => 'teacher']);
$this->actingAs($user)
->post('/teacher/formations', [
'title' => '', // vide = invalide
])
->assertSessionHasErrors(['title', 'slug', 'short_description', 'category_id']);
});Tester l'API
it('retourne les formations en JSON', function () {
Formation::factory()->count(3)->create(['is_published' => true]);
$this->getJson('/api/formations')
->assertStatus(200)
->assertJsonCount(3, 'data');
});
it('refuse l\'accès API sans token', function () {
$this->getJson('/api/user')
->assertStatus(401);
});Exécuter les tests
php artisan test # Tous les tests
php artisan test --filter=Formation # Seulement les tests Formation
php artisan test --parallel # Tests en parallèle (plus rapide)