Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Une introduction à la réflexion en PHP (et comment cela joue dans les tests unitaires)

40

Au cours des dernières semaines, j’ai écrit sur les tests unitaires pour les membres du site (et quelque chose que je prévois de continuer à faire dans le prochain article). C’est quelque chose que je pense; si vous écrivez du code côté serveur, vous devriez le faire.

Bien sûr, c’est plus facile pour moi de le dire que de le faire, donc même si j’essaie de faire du bon travail, il y a toujours de la place pour que je m’améliore. Je dis cela plus comme une vérification personnelle qu’autre chose, alors je m’éloigne du sujet.

L’un des concepts qui revient souvent lors des tests est l’idée de tester les valeurs des attributs privés. Par exemple, disons que vous avez un setter, mais vous n’avez pas nécessairement un getter pour cette valeur particulière.

Il est facile de dire "Eh bien, alors vous devez écrire un getter", mais ce n’est pas toujours le cas. Je veux dire, que se passe-t-il si vous stockez des informations dans la classe qui n’ont pas besoin d’être exposées à des classes tierces ?

Comment alors sommes-nous censés écrire des tests sur ce type de données lorsque nous voulons y accéder mais que nous n’en avons pas la capacité et que nous ne voulons pas compromettre l’intégrité de notre travail ?

C’est là que la réflexion entre en jeu.

Réflexion en PHP

Plus précisément, pour comprendre comment inspecter la valeur d’une variable donnée de l’extérieur vers l’intérieur, il faut savoir utiliser la réflexion.

Heureusement, PHP nous fournit une API puissante pour le faire, et cela vaut probablement la peine d’entrer dans les détails dans un autre article. Mais, pour celui-ci, s’en tenir à l’essentiel.

Une définition de travail

Tout d’abord, un regard sur ce que signifie la réflexion. Le manuel PHP le définit ainsi :

La classe ReflectionClass rapporte des informations sur une classe.

Mais je pense que ça vaut la peine d’avoir quelque chose d’un peu plus solide. Allons-y avec quelque chose comme ça au moins pour ce post:

La réflexion est la façon dont un programme s’inspecte et se modifie pendant l’exécution.

Ce n’est peut-être pas génial; peut être pas.

Une introduction à la réflexion en PHP (et comment cela joue dans les tests unitaires)

Mais cela servira l’objectif de ce post.

Lire une valeur par réflexion

Supposons que pour cet article, vous ayez une classe d’espaces de noms sur AcmePluginAPIClient et qu’elle ait une propriété appelée username. Nous verrons plus tard à quoi pourrait ressembler une implémentation très basique de ceci.

Bien sûr, ce serait beaucoup plus étoffé dans un plugin réel.

Supposons cependant que vous souhaitiez définir la valeur de l’attribut, puis lire sa valeur. La mise en garde est que la propriété est marquée comme privée et qu’il n’y a aucun moyen de la lire de l’extérieur.

C’est là que la réflexion devient utile. Autrement dit, nous pouvons utiliser une partie du programme pour se regarder et rendre compte de ce qu’il voit. (Réflexion, compris ? C’est comme quand nous voulons savoir ce qui se passe avec nous-mêmes et que personne d’autre n’est là, alors nous nous regardons dans un miroir et voyons ce qu’il y a.)

Pour ce faire, vous devez faire cinq choses :

  1. Instanciez la classe que vous souhaitez tester,
  2. Définissez la valeur de la variable,
  3. Prenez une instance de ReflectionClass pour la classe que nous voulons tester,
  4. Définissez sa propriété sur accessible,
  5. Lisez la valeur.

Voici donc une série d’essentiels qui fourniront les étapes nécessaires pour faire exactement cela.

1 Instancier la classe

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  // Other functions for class implementation...
}

2 Définissez la valeur

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  public function setUsername($username)
  {
    $this->username = $username;
  }

  // Other functions for class implementation...
}

3 Instancier les objets réfléchis

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // More to come...
  }
}

4. Définissez la propriété, marquez-la comme accessible

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // More to come...
  }
}

5 Lisez la valeur

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // Grab a reference to the private property by making it accessible.
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // And finally, read it's value.
    $usernameValue = $usernameProperty->getValue($client);
  }
}

Et c’est l’amorce de base sur la réflexion

À ce stade, cela devrait vous donner quelques informations de base sur ce qu’est Reflection, comment l’utiliser et pourquoi il est utile, en particulier dans le cas des tests unitaires.

C’est l’un de ces concepts qui peuvent devenir plus complexes car l’API de réflexion de PHP est assez puissante (mais relativement facile à comprendre). Cependant, lorsque vous le couplez avec des tests unitaires, il y a beaucoup de choses qui peuvent être faites.

Ma prise sans vergogne

Cela dit, si vous souhaitez apprendre les tenants et les aboutissants de ce genre de choses, n’hésitez pas à consulter la zone réservée aux membres du site. Je construis, chaque semaine, un carnet de commandes pour nous aider à nous concentrer sur l’adoption de meilleures pratiques en tant que développeurs WordPress.

Les tests unitaires, la réflexion et plus encore ne sont que la dernière partie de celui-ci.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More