WordPress Advanced OOP Part 3: Unit Testing for WordPress rest API plug – in
}
Renvoie un tableau fictif de messages fictifs
Retour à $Simulation post;
}
Toujours renvoyer quelque chose même s’il n’a pas changé
Retourner $postsornull;
}
}
Dans mon dernier billet, j’ai clairement indiqué que la classe n’était pas prête pour les tests unitaires. Cette approche pose quatre problèmes:
Le rappel du filtre détermine si le filtre doit fonctionner pour obtenir de nouveaux résultats fournit un moyen de supprimer le filtre. Guidé par le principe de la responsabilité unique, nous avons divisé le cours en quatre approches. Cela nous permettra de séparer la logique d’entreprise qui nécessite des tests unitaires de l’intégration WordPress, que nous pouvons ajouter plus tard. Cela nous permettra de créer un test de simulation. Ces quatre préoccupations sont l’API publique de la classe. L’API commune est définie dans l’interface PHP. De cette façon, nous pouvons utiliser les recommandations de type et les déclarations de type retournées pour cette interface. Par conséquent, la façon dont la classe qui implémente l’interface fonctionne n’est pas importante pour les autres classes qui dépendent de l’interface.
Cette approche est un élément fondamental de principes solides qui nous aident non seulement à construire nos propres simulations d’essai. Cela signifie que, sur le plan conceptuel, nous ne construisons plus de système pour remplacer les résultats des requêtes wp \ u lors des demandes d’api rest. Au lieu de cela, nous construisons un système pour remplacer les résultats des requêtes wp \ u dans n’importe quel cas et pour remplacer les requêtes wp \ u lors des requêtes rest API par une implémentation de référence. Cela reste conforme à nos exigences initiales. Il facilitera également l’ajout d’autres implémentations à l’avenir.
Il s’agit d’une interface avec une approche intéressante: l’interface filterprewpquery
{Y}
\/ * *
Modifier les résultats de l’objet de requête wp \ U
* *
Utiliser \
C’est une dette technique. Voyons pourquoi ça arrive.
Dans notre liste de points d’intérêt, quelques points d’intérêt concernent les interactions dans WordPress. Nous pouvons les diviser en interactions que la simulation simple peut résoudre et en interactions que nous devons tester les effets. Par exemple, je peux créer une simulation de wp \ u post dont nous avons besoin et en qui je fais confiance, en l’ajoutant simplement à mon test \/ simulation: <?php
/**
* Filtro classeWPQuery
*
* Cambia l'oggetto WP_Query
*
* @pacchetto EsempioPlugin
*/
classe FilterWPQuery
{
/**
* Dimostra come utilizzare un modo diverso per impostare i post restituiti da WP_Query
* @uses "posts_pre_query"
*
* @param $postsOrNull
* @param \WP_Query $query
* @return misto
*/
funzione statica pubblica posts_pre_query($postsOrNull, $query)
{
//Eseguito solo durante le richieste API di WordPress
if (defined('REST_REQUEST') && REST_REQUEST) {
//Previeni le ricorsioni
remove_filter('posts_pre_query', [FilterWPQuery::class, 'posts_pre_query'], 10);
//Non eseguire se i messaggi sono già stati inviati
if (is_null($postsOrNull)) {
//Crea 4 post fittizi con titoli diversi
$mockPosts = [];
for ($i = 0; $i Post _ title = \
}
Renvoie un tableau fictif de messages fictifs
Retour à $Simulation post;
}
} Notez que je dois le garder dans l’espace de noms global, car c’est WP _ posts dans ce cas. Pour ce faire et continuer à utiliser l’autoloader du compositeur, j’ai ajouté ce fichier au paramètre \
Super, le problème est résolu. Dans notre requête de faux filtres, nous utiliserons ces faux messages wp \ U. Dans la requête false filter, je vais résoudre les problèmes d’interaction qui ont des effets secondaires, comme supprimer les filtres et les ignorer. C’est pourquoi nous avons des tests d’intégration. L’interface applique le même schéma et nous pouvons croire que, tant qu’elle est utilisée, nos tests d’intégration écraseront les méthodes que nous ne pouvons pas couvrir complètement dans les tests unitaires. Voici la question du faux filtrage: Post _ title = \
}
Renvoie un tableau fictif de messages fictifs
Retour à $Simulation post;
}
} dans cette simulation, nous résolvons le problème de la méthode shouldfilter basée sur un ensemble de constantes dans WordPress en renvoyant simplement true. Si nous ajoutons une autre maquette qui renvoie false à cette méthode, nous pouvons tester le Code complètement indépendamment. En cas d’utilisation avec wordpress, nos tests d’intégration ne couvriront que
Le Code répond correctement à cet effet.
<?php
spazio dei nomi CalderaLearn\RestSearch\Tests\Mock;
/**
* Filtro classeWPQuery
*
* Classe simulata totalmente disaccoppiata da WordPress
*
* @pacchetto CalderaLearn\RestSearch\Tests\Mock
*/
class FilterWPQuery estende \CalderaLearn\RestSearch\FilterWPQuery
{
/** @inheritdoc */
funzione statica pubblica shouldFilter() :bool
{
restituire vero;
}
/** @inheritdoc */
funzione pubblica statica removeFilter()
{
Restituzione;
}
/** @inheritdoc */
funzione statica pubblica getPosts() : array
{
//Crea 4 post fittizi con titoli diversi
$mockPosts = [];
for ($i = 0; $i Nous allons maintenant tester les callbacks du crochet WordPress en isolement total. C’est facile parce que le filtre posts _ pre Query que nous utilisons est un filtre de retour précoce. NULL par défaut, si la valeur de retour de posts _ pre Query n’est pas nulle, la méthode de requête WP Query retourne plus tôt que par défaut. Cela signifie que nous ne devons parler que des cas où les rappels sont nuls et non nuls. Les autres crochets sont plus complexes. J’a i choisi une méthode plus simple parce qu’elle est plus facile à enseigner.
Puisque le rappel est la seule façon d’utiliser les trois autres méthodes, nous aimerions d’abord écrire des tests pour les trois autres méthodes. Le rappel de cette méthode prend les trois autres méthodes comme dépendances uniques. Si d’autres méthodes sont écrasées, nous ne pouvons faire confiance qu’aux tests unitaires qui écrasent les callbacks, Alors commençons par eux. D’abord, regardons la méthode getposts. Aux fins de ce test, tout ce qui m’intéresse, c’est que la méthode renvoie un tableau qui contient des objets WP _ post. Le contenu n’a pas d’importance. <?php
spazio dei nomi CalderaLearn\RestSearch\Tests\Mock;
/**
* Filtro classeWPQuery
*
* Classe simulata totalmente disaccoppiata da WordPress
*
* @pacchetto CalderaLearn\RestSearch\Tests\Mock
*/
class FilterWPQuery estende \CalderaLearn\RestSearch\FilterWPQuery
{
/** @inheritdoc */
funzione statica pubblica shouldFilter() :bool
{
restituire vero;
}
/** @inheritdoc */
funzione pubblica statica removeFilter()
{
Restituzione;
}
/** @inheritdoc */
funzione statica pubblica getPosts() : array
{
//Crea 4 post fittizi con titoli diversi
$mockPosts = [];
for ($i = 0; $i Assertion true (IS _ array ($Results));
Ceci vérifie seulement qu’il retourne le tableau. Il doit retourner un tableau, ce qu’il suggère pour le type. Ce test ne concerne essentiellement que nos simulations, pas les classes réelles que nous voulons tester. Le prochain test couvrira le tableau: Assertion False (NULL ($result));
Assurez – vous que le résultat est un ensemble de messages WP
$in Loop = false;
Foreach (le résultat est $result)
$en boucle = vrai;
S’assurer que tous les résultats sont des messages WP
$this – > assertion true (IS _ A ($result, \
}
S’assurer que le cycle a été exécuté
$this – > assertion true ($Loop);
Encore une fois, c’est plus une simulation qu’un test réel. Établissement
Renvoie pour créer deux variables qui devraient être identiques. J’ai commencé comme ça: Assertion true (IS _ array ($Results));
Assurez – vous que les deux tableaux sont de la même taille
$this – > assertion count (count ($expected), $result);
Ces tableaux sont différents, veuillez comparer la signification du contenu
Utilisé pour s’assurer que le cycle d’essai est exécuté
$in Loop = false;
\/ * *
:: comparer les résultats escomptés aux résultats effectifs;
Var int $I
Var \ wp _ post $post
* \/
Foreach (estimé à $i = > $post)
$en boucle = vrai;
Vérifier que les titres des messages simulés et générés sont les mêmes
$this – > assertsame ($post – > Post _ title, $results [$i] – > Post title);
}
S’assurer que le cycle a été exécuté
$this – > assertion true ($Loop);
Si l’entrée est vide, je peux faire confiance à cette classe pour qu’elle fonctionne comme prévu. Ce n’est pas suffisant parce que je dois m’assurer qu’il ne change pas le tableau lorsqu’il est passé. Ces tests semblent presque identiques. La seule différence est que j’a i passé une série de messages à un rappel de méthode. Assertion true (IS _ array ($Results));
Assurez – vous que les deux tableaux sont de la même taille
$this – > assertion count (count ($expected), $result);
Ces tableaux sont différents, veuillez comparer la signification du contenu
Utilisé pour s’assurer que le cycle d’essai est exécuté
$in Loop = false;
\/ * *
:: comparer les résultats escomptés aux résultats effectifs;
Var int $I
Var \ wp _ post $post
* \/
Foreach (estimé à $i = > $post)
$en boucle = vrai;
Vérifier que les titres des messages simulés et générés sont les mêmes
$this – > assertsame ($post – > Post _ title, $results [$i] – > Post title);
}
S’assurer que le cycle a été exécuté
$this – > assertion true ($Loop);
} la partie vraiment importante des pseudo – objets dans la description des tests de filterwquery, j’ai toujours mentionné les défauts de ma pochette. Mais je veux
Soulignez les raisons de mon accord et le fait que j’ajouterai plus tard les essais d’intégration et d’acceptation. Si vous regardez Mock lui – même, il ne s’agit pas seulement d’implémenter l’interface que j’ai créée. Pour ce faire, il étend le filtre wpquery original et remplace chaque méthode autre que la méthode de rappel. Les tests unitaires pour les callbacks de méthode incluent le vrai filterwpquery:: Callback (). Nous pouvons faire confiance à ce test tant que d’autres méthodes de la classe font ce qu’elles sont censées faire. Les blagues nous permettent d’écrire et de faire confiance à nos tests de cette façon. L’utilisation d’interfaces et de classes abstraites ajoute de la complexité. Par conséquent, il est presque impossible d’écrire une implémentation système qui a échoué avec filterwquery. Je tiens à souligner que c’est précisément pour cette raison que la complexité de Solid oop PHP mérite d’être soulignée. Nous pouvons construire des systèmes pour faire quelque chose de similaire, plutôt que d’écrire du Code pour faire quelque chose, et croire que les modèles sont toujours efficaces lorsqu’ils sont appliqués de la seule façon possible. Prochaines étapes: overlay These are the basis for Unit Testing WordPress Code, separate from WordPress. Il s’agit d’un problème qui a été résolu en se moquant et en suivant un principe qui exige plusieurs acronymes pour correspondre à une phrase. J’espère que cet article vous montre comment reconstruire le Code pour l’isoler pour les tests et comment les écrire. J’ai combiné tous les exemples de code de cet article avec les derniers plug – ins. J’ai mis une étiquette GIT à la fin de cet article. Pour mettre en pratique ce que vous avez appris, je recommande de brancher les plug – ins et d’ajouter une couverture complète pour les tests. Vous devez faire quelques reconstructions. J’ai construit des objets de simulation pour les tests afin de supprimer l’api plug – in WordPress. C’est bien, parce qu’on n’a pas fait grand – chose. Pour des contenus plus complexes, par exemple:
En fait, avec ces crochets ajoutés, il est important de simuler l’API plug – in, et des outils comme 10up \/ WP Mock seront très utiles. Dans mon prochain article, nous commencerons à tester avec moins d’isolement. Nous écrirons des tests d’intégration pour outrepasser l’interaction avec l’api plug – in WordPress en utilisant la suite de tests WordPress.