Skip to main content

Pourquoi mocker

Lors de la rédaction de tests, certains traitements ne doivent pas être exécutés (envoi de mail, cache, API externe). On remplace ces traitements par des « imitations » : c’est le mock. Avantages :
  • Rapidité — pas d’appel externe ni de traitement lourd
  • Stabilité — indépendance vis-à-vis de l’état des services externes
  • Portée claire — chaque test cible une classe/méthode
Laravel expose des helpers pour mocker événements, jobs, façades, etc. En interne, il utilise Mockery, utilisable sans setup complexe.

Mocker des objets

Pour mocker un objet injecté via le conteneur, enregistrez l’instance de mock dans le conteneur. Il retournera alors le mock au lieu d’instancier la classe.

Méthode mock()

Équivalent plus concis via la méthode de la classe de test de base.

Méthode partialMock()

Pour ne mocker que certaines méthodes ; les autres s’exécutent normalement.

Méthode spy()

Un spy ressemble à un mock mais on vérifie les interactions après l’exécution.

Mocker une façade

Les façades, contrairement aux méthodes statiques classiques, sont mockables. Vous gardez la testabilité de l’injection de dépendances avec une syntaxe concise. Contrôleur utilisant le cache :
Utilisez expects() pour mocker Cache::get.
Ne mockez pas la façade Request : passez les valeurs via les méthodes HTTP de test (get, post, …). De même, appelez Config::set() dans le test plutôt que de mocker la façade Config.

Espionner une façade

Utilisez spy() sur la façade.

Manipulation du temps

Pour tester une logique dépendante du temps, changez ce que now() ou Carbon::now() retourne. La classe de base des tests fonctionnels fournit des helpers.

travel() — Déplacer le temps

Avec une closure

Passez une closure pour tester dans un contexte temporel donné puis revenir automatiquement.

freezeTime() — Figer le temps

freezeTime() fige l’heure actuelle ; freezeSecond() la fige au début de la seconde.

Exemple : verrouillage des threads inactifs

Utile pour tester une fonction où un thread se verrouille après une période d’inactivité.
Les méthodes de time travel sont disponibles dans les tests fonctionnels (héritant de Tests\TestCase), pas dans le TestCase de PHPUnit de base.

Récapitulatif

Mock

Temps

Dernière modification le 13 juillet 2026