Les « Data Providers » (à ne pas confondre avec les classes DataProvider du code source de notre projet) sont des méthodes permettant de fournir à un test un ensemble de données à tester.

Le Data Provider utilise un \Generator (par le biais de yield) pour fournir en jeu de données. Le test relié à ce data provider utilise avec ce jeu de données par le biais de ses paramètres.

Il y a quelques règles d’utilisation :

  • Un Data Provider est une méthode public et static qui retourne un \Generator.
    • Elle peut retourner un tableau (comme indiqué dans la documentation), mais il est préférable de retourner un \Generator pour éviter de charger toutes les données en mémoire.
      C’est une vision plus “logique” du Data Provider et c’est aussi plus simple à écrire.
  • Un Data Provider est suffixé par Provider (ou DataProvider).
  • La méthode de test qui utilise le Data Provider doit utiliser l’attribut #[DataProvider('nom_du_data_provider')].
  • La méthode de test définie ses paramètres selon les données fournies par le Data Provider.

1. Tester MediaDto

Le test du constructeur va maintenant utiliser un Data Provider afin de s’assurer que le constructeur fonctionne dans plusieurs situations.

Je vous aide pour les deux premiers jeux de données :

public static function movieProvider(): \Generator
{
    yield 'it_creates_a_dto_for_the_movie_2001_a_space_odyssey' => [
        'name' => '2001 : L\'Odyssée de l\'espace',
        'author' => 'Stanley Kubrick',
        'year' => 1968,
        'type' => MediaTypeEnum::MOVIE,
    ];
    yield 'it_creates_a_dto_for_a_dummy_movie' => [
        'name' => '-- Name --',
        'author' => '-- Author --',
        'year' => 0,
        'type' => MediaTypeEnum::MOVIE,
    ];
}

À vous d’adapter votre test pour utiliser ce Data Provider et complétez le Data Provider avec d’autres jeux de données.

Utiliser plusieurs Data Providers

Un même test peut recevoir des jeux de données de plusieurs Data Providers, tant que ces derniers retournent les mêmes types et même nombre de données correspondant aux paramètres du test.

Il suffira d’ajouter une deuxième fois l’attribut sur la méthode de test.

Créez le SeriesProvider pour fournir des jeux de données correspondant au MediaTypeEnum::SERIES.

2. Tester MediaTypeEnumProvider

De la même façon, modifiez votre test de la classe MediaTypeEnumFactory pour utiliser un Data Provider pour les valeurs valides (par exemple : movie, MOVIE, etc.) et un autre pour les valeurs invalides.

État des lieux

Vous devriez maintenant avoir à votre disposition une vingtaine de tests (chaque jeu de données fourni par un Data Provider est un test) et une quarantaine d’assertions.

Vous vous rendez compte que les tests de MediaDto sont plutôt inutiles, car ils ne testent aucun algorithme, seulement le fait qu’une valeur passée en paramètre est affectée à un champ de l’objet. Les probabilités qu’une modification dans le code altère ce comportement sont très faibles.

Les tests de MediaTypeEnumFactory sont plus intéressants, puisque la valeur passée en paramètre subit une transformation pour couvrir un ensemble de valeurs plus large et on s’assure que des valeurs invalides lèvent une exception, bloquant alors l’exécution du code.

C’est des comportements que l’on veut s’assurer d’être immuables.

Dans un ordre d’idée similaire, on voudrait pouvoir s’assurer que certaines pratiques de développement sont respectées, c’est ce que l’on va voir dans la suite.