}
Renvoie un tableau fictif de messages fictifs
Retour à $mulation post
}
Toujours renvoyer quelque chose même srsquoil nrsquoa pas changé
Retourner $postsornull
}
}
Dans mon dernier billet, jrsquoai clairement indiqué que la classe nrsquoé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 lrsquoAPI publique de la classe. LrsquoAPI commune est définie dans lrsquointerface 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 lrsquointerface fonctionne nrsquoest pas importante pour les autres classes qui dépendent de lrsquointerface.
Cette approche est un élément fondamental de principes solides qui nous aident non seulement à construire nos propres simulations drsquoessai. 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 drsquoapi rest. Au lieu de cela, nous construisons un système pour remplacer les résultats des requêtes wp u dans nrsquoimporte 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 lrsquoajout drsquoautres implémentations à lrsquoavenir.
Il srsquoagit drsquoune interface avec une approche intéressante: lrsquointerface filterprewpquery
{Y}
* *
Modifier les résultats de lrsquoobjet de requête wp U
* *
Utiliser
Crsquoest 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 lrsquoajoutant simplement à mon test simulation: lt?php
**
* Filtro classeWPQuery
*
* Cambia l039oggetto WP_Query
*
* @pacchetto EsempioPlugin
*
classe FilterWPQuery
{
**
* Dimostra come utilizzare un modo diverso per impostare i post restituiti da WP_Query
* @uses quotposts_pre_queryquot
*
* @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(039REST_REQUEST039) ampamp REST_REQUEST) {
Previeni le ricorsioni
remove_filter(039posts_pre_query039, [FilterWPQuery::class, 039posts_pre_query039], 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 à $mulation post
}
} Notez que je dois le garder dans lrsquoespace de noms global, car crsquoest WP _ posts dans ce cas. Pour ce faire et continuer à utiliser lrsquoautoloader du compositeur, jrsquoai 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 drsquointeraction qui ont des effets secondaires, comme supprimer les filtres et les ignorer. Crsquoest pourquoi nous avons des tests drsquointégration. Lrsquointerface applique le même schéma et nous pouvons croire que, tant qursquoelle est utilisée, nos tests drsquointé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 à $mulation 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. 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.
lt?php
spazio dei nomi CalderaLearnRestSearchTestsMock
**
* Filtro classeWPQuery
*
* Classe simulata totalmente disaccoppiata da WordPress
*
* @pacchetto CalderaLearnRestSearchTestsMock
*
class FilterWPQuery estende CalderaLearnRestSearchFilterWPQuery
{
** @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. Crsquoest 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 nrsquoest 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. Jrsquoa i choisi une méthode plus simple parce qursquoelle est plus facile à enseigner.
Puisque le rappel est la seule façon drsquoutiliser les trois autres méthodes, nous aimerions drsquoabord é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. drsquoautres méthodes sont écrasées, nous ne pouvons faire confiance qursquoaux tests unitaires qui écrasent les callbacks, Alors commençons par eux. Drsquoabord, regardons la méthode getposts. Aux fins de ce test, tout ce qui mrsquointéresse, crsquoest que la méthode renvoie un tableau qui contient des objets WP _ post. Le contenu nrsquoa pas drsquoimportance. lt?php
spazio dei nomi CalderaLearnRestSearchTestsMock
**
* Filtro classeWPQuery
*
* Classe simulata totalmente disaccoppiata da WordPress
*
* @pacchetto CalderaLearnRestSearchTestsMock
*
class FilterWPQuery estende CalderaLearnRestSearchFilterWPQuery
{
** @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 qursquoil retourne le tableau. Il doit retourner un tableau, ce qursquoil 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 que le résultat est un ensemble de messages WP
$in Loop = false
Foreach (le résultat est $result)
$en boucle = vrai
Srsquoassurer que tous les résultats sont des messages WP
$this gt assertion true (IS _ A ($result,
}
Srsquoassurer que le cycle a été exécuté
$this gt assertion true ($Loop)
Encore une fois, crsquoest plus une simulation qursquoun test réel. Établissement
Renvoie pour créer deux variables qui devraient être identiques. Jrsquoai commencé comme ça: Assertion true (IS _ array ($Results))
Assurez que les deux tableaux sont de la même taille
$this gt assertion count (count ($expected), $result)
Ces tableaux sont différents, veuillez comparer la signification du contenu
Utilisé pour srsquoassurer que le cycle drsquoessai 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 = gt $post)
$en boucle = vrai
Vérifier que les titres des messages simulés et générés sont les mêmes
$this gt assertsame ($post gt Post _ title, $results [$i] gt Post title)
}
Srsquoassurer que le cycle a été exécuté
$this gt assertion true ($Loop)
lrsquoentrée est vide, je peux faire confiance à cette classe pour qursquoelle fonctionne comme prévu. Ce nrsquoest pas suffisant parce que je dois mrsquoassurer qursquoil ne change pas le tableau lorsqursquoil est passé. Ces tests semblent presque identiques. La seule différence est que jrsquoa i passé une série de messages à un rappel de méthode. Assertion true (IS _ array ($Results))
Assurez que les deux tableaux sont de la même taille
$this gt assertion count (count ($expected), $result)
Ces tableaux sont différents, veuillez comparer la signification du contenu
Utilisé pour srsquoassurer que le cycle drsquoessai 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 = gt $post)
$en boucle = vrai
Vérifier que les titres des messages simulés et générés sont les mêmes
$this gt assertsame ($post gt Post _ title, $results [$i] gt Post title)
}
Srsquoassurer que le cycle a été exécuté
$this gt assertion true ($Loop)
} la partie vraiment importante des pseudo objets dans la description des tests de filterwquery, jrsquoai toujours mentionné les défauts de ma pochette. Mais je veux
Soulignez les raisons de mon accord et le fait que jrsquoajouterai plus tard les essais drsquointégration et drsquoacceptation. regardez Mock lui même, il ne srsquoagit pas seulement drsquoimplémenter lrsquointerface que jrsquoai 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 drsquoautres méthodes de la classe font ce qursquoelles sont censées faire. Les blagues nous permettent drsquoécrire et de faire confiance à nos tests de cette façon. Lrsquoutilisation drsquointerfaces et de classes abstraites ajoute de la complexité. Par conséquent, il est presque impossible drsquoécrire une implémentation système qui a échoué avec filterwquery. Je tiens à souligner que crsquoest précisément pour cette raison que la complexité de Solid oop PHP mérite drsquoêtre soulignée. Nous pouvons construire des systèmes pour faire quelque chose de similaire, plutôt que drsquoécrire du Code pour faire quelque chose, et croire que les modèles sont toujours efficaces lorsqursquoils 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 srsquoagit drsquoun problème qui a été résolu en se moquant et en suivant un principe qui exige plusieurs acronymes pour correspondre à une phrase. Jrsquoespère que cet article montre comment reconstruire le Code pour lrsquoisoler pour les tests et comment les écrire. Jrsquoai combiné tous les exemples de code de cet article avec les derniers plug ins. Jrsquoai mis une étiquette GIT à la fin de cet article. Pour mettre en pratique ce que avez appris, je recommande de brancher les plug ins et drsquoajouter 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. Crsquoest bien, parce qursquoon nrsquoa pas fait grand chose. Pour des contenus plus complexes, par exemple:
En fait, avec ces crochets ajoutés, il est important de simuler lrsquoAPI plug in, et des outils comme 10up WP Mock seront très utiles. Dans mon prochain article, nous commencerons à tester avec moins drsquoisolement. Nous écrirons des tests d’intégration pour outrepasser l’interaction avec l’api plug in WordPress en utilisant la suite de tests WordPress.
WordPress Advanced OOP Part 3: Unit Testing for WordPress rest API plug in