Laravel
Laravel • Module Test • Chapitre 2

Tests Unitaires & Mocks avec Facades Fakes

Les tests unitaires en Laravel doivent être autonomes et instantanés. Pour tester les services métier isolés sans déclencher de vrais appels d'API externes, d'envois d'e-mails ou de tâches en file d'attente, Laravel propose son arme secrète : les Facades Fakes (Http::fake(), Mail::fake(), Queue::fake()).

⚡
PHPUnit TestCase Pur

Hérite de PHPUnit\Framework\TestCase sans démarrer le conteneur IoC Laravel pour une vitesse maximale.

🎭
Facades Fakes

Interception native des services lourds : Http::fake(), Mail::fake(), Event::fake().

🕒
Voyage Temporel (Carbon)

Contrôlez l'horloge avec $this->travelTo() ou Carbon::setTestNow() pour tester la fin des périodes d'essai.

📦
Custom Rules & Actions

Validation isolée des règles Rule::passes() et des classes d'actions invokables sans requête HTTP.

Studio Interactif : Interception Mail & Queue avec Facades Fakes

Simulez l'exécution d'un service d'inscription et observez la capture des courriels et des jobs sans aucun envoi réel.

Service Métier : RegisterUserService::handle()
// Code de test Pest avec Fakes :
Mail::fake();
Queue::fake();
$service->handle('Lucas', 'lucas@learnweb.fr');
// En attente d'exécution du test unitaire...
Zéro réseau, zéro thread SMTP, test résolu en 3ms
1. Mock HTTP Client avec Http::fake()

Simulez la réponse d'une passerelle Stripe ou d'une API météo externe sans sortir de votre machine.

use Illuminate\Support\Facades\Http;

it('interroge l API de conversion de devise', function () {
    // Interception par motif d'URL
    Http::fake([
        'api.rates.com/*' => Http::response(['rate' => 1.08], 200),
    ]);

    $service = new CurrencyConverter();
    $montantUsd = $service->convertirEurEnUsd(100);

    expect($montantUsd)->toBe(108.0);

    // Vérifie qu'un seul appel réseau a été émis
    Http::assertSentCount(1);
});
2. Voyage Temporel avec $this->travel()

Vérifiez la logique d'expiration d'abonnements ou de promotions avec les utilitaires temporels natifs.

it('détecte qu un abonnement d essai est expiré après 14 jours', function () {
    $subscription = new TrialSubscription(['created_at' => now()]);

    expect($subscription->isActive())->toBeTrue();

    // Avance de 15 jours dans le futur
    $this->travel(15)->days();

    expect($subscription->isActive())->toBeFalse();

    // Retour au présent réel
    $this->travelBack();
});