Génération de fixtures
Les fixtures sont de fausses données générées à des fins de tests. Vous pouvez générer autant de données que vous le souhaitez en installant les packages suivants :
L’installation vous crée un dossier /src/DataFixtures dans lequel vous spécifierez l’ensemble de vos fixtures.
Elle vous met également à disposition le package FakerPHP qui apporte un ensemble de méthodes pour faciliter la création de fausses données.
Création d'une fixture abstraite
Certaines choses sont particulièrement pénibles à faire dans les fixtures, notamment la gestion des relations.
Lorsque les fixtures sont découpées en plusieurs fichiers, il faut alors passer par deux méthodes fournies par la classe parente Fixture : getReference() et addReference().
Ce process est fastidieux et relativement complexe par rapport à ce que ça pourrait être, nous allons donc faire hériter toutes nos fixtures d’une classe abstraite qui s’occupera de gérer ces petites choses à un seul endroit dans notre codebase.
Pour cela, créer une nouvelle classe AbstractFixture.php dans /src/DataFixtures :
Création de notre première fixture d'entité
Nous allons ensuite pouvoir créer notre première fixture avec la commande :
Nommez vos fixtures de la manière suivante : nom de l’entité + “Fixtures” (ex:
BookFixtures)
Et enfin la remplir comme dans l’exemple suivant :
La méhode load
La méthode load est obligatoire puisque c’est elle qui est appelée au lancement de la fixture en question.
À l’intérieur, nous appelons la méthode generate() de notre classe parente, qui elle se charge de boucler, persister puis sauvegarder les entités nouvellement créées.
La méthode generate() attend un deuxième paramètre qui est une fonction (un callback), dans laquelle nous créons notre entité puis la retournons.
De cette manière, lorsque generate() boucle sur un nombre d’itérations, elle appellera à chaque fois le callback qui lui retournera une nouvelle entité.
La méhode getGroups
Le composant de fixtures met à disposition une interface FixtureGroupInterface à implémenter dans nos fixtures si on le souhaite.
Cette implémentation requiert d’avoir une méthode nommée getGroups dans laquelle on retourne un tableau.
Grâce à cette méthode, vous pouvez désormais filtrer le lancement de vos fixtures à certains groupes, par exemple en faisant la commande suivante pour ne lancer que les fixtures de dév :
La méhode getDependencies
Il arrive régulièrement que les fixtures se déroulent nécessairement dans un certain order pour que tout se passe bien.
Par exemple si l’on a une relation User <-> Article, il faut obligatoirement que les faux User soient créés avant les faux Article pour pouvoir les lier.
Heureusement, le composant de fixtures nous permet de le faire simplement en implémentant l’interface DependentFixtureInterface et en remplissant la fonction getDependencies() par un tableau de toutes les fixtures dont elle dépend.
Dans l’exemple un peu plus haut, on voit donc que les fixtures pour l’entité Book doivent attendre que les fixtures de l’entité User soient chargées avant de pouvoir se déclencher.