Laravel
Laravel • Module Test • Chapitre 3

Tests des Contrôleurs, Routes & Vues (Feature Tests)

Les Feature Tests représentent le cœur battant de votre suite de validation Laravel. Ils testent un flux HTTP complet depuis l'entrée du routeur jusqu'à la sortie du contrôleur, en passant par les middlewares de session, les règles Form Request et le rendu des templates Blade.

🌐
Web vs JSON

Utilisation de $this->get() / post() pour le web classique, et getJson() / postJson() pour les API REST.

👁️
Rendu Blade

Vérification des variables transmises avec assertViewHas('articles') et du texte présent avec assertSee().

📋
Form Requests

Assertion précise des erreurs de validation de champs via assertSessionHasErrors(['email']).

🔀
Redirections & Flash

Validation des flux de succès avec assertRedirect() et assertion des messages flash de session.

Studio Interactif : Simulateur de Requête Feature & Assertions

Modifiez les paramètres du formulaire pour observer les assertions chaînées de Laravel en temps réel.

Formulaire sous Test : POST /articles
Statut attendu : 302 Redirect
// Script de test Pest correspondant :
$response = $this->post('/articles', [
  'title' => 'Masterclass Pest & Laravel',
  'content' => 'Guide complet des tests automatisés...',
]);
✓ $response->assertRedirect('/articles');
✓ $response->assertSessionHas('success');
✓ $response->assertSessionHasNoErrors();
1. Test de Vue Blade avec Variables

Vérifiez que le contrôleur passe bien la collection à la vue Blade et que le contenu s'affiche correctement.

it('affiche le catalogue et la pagination', function () {
    Article::factory()->count(3)->create();

    $response = $this->get('/articles');

    $response->assertOk()
        ->assertViewIs('articles.index')
        ->assertViewHas('articles', function ($articles) {
            return $articles->count() === 3;
        })
        ->assertSee('Catalogue des Formations');
});
2. Test de Form Request avec Validation Robuste

Vérifiez le rejet immédiat avec les règles unique, min et required.

it('rejette un titre déjà existant en base', function () {
    Article::factory()->create(['title' => 'Architecture Clean']);

    $response = $this->post('/articles', [
        'title' => 'Architecture Clean',
        'content' => 'Texte descriptif...',
    ]);

    $response->assertSessionHasErrors([
        'title' => 'The title has already been taken.'
    ]);
});