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()).
Hérite de PHPUnit\Framework\TestCase sans démarrer le conteneur IoC Laravel pour une vitesse maximale.
Interception native des services lourds : Http::fake(), Mail::fake(), Event::fake().
Contrôlez l'horloge avec $this->travelTo() ou Carbon::setTestNow() pour tester la fin des périodes d'essai.
Validation isolée des règles Rule::passes() et des classes d'actions invokables sans requête HTTP.
Simulez l'exécution d'un service d'inscription et observez la capture des courriels et des jobs sans aucun envoi réel.
RegisterUserService::handle()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);
});$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();
});