Comment tester une méthode qui est appelée par une action crochet
-
29-09-2020 - |
Question
Le constructeur de ma classe ajoute une action à l' 'init' action crochet:
class My_Custom_Post_Type {
function __construct( $type ) {
$this->type = $type;
add_action( 'init', array( $this, 'register_my_type' );
}
function register_my_type() {
register_post_type( $this->type);
}
}
J'ai essayé de tester cela dans une unité de test et finalement réalisé qu'il n'y a aucune raison pour que le "init" action accrocher à feu.Est-il possible de tester que la register_my_type méthode est appelée et qu'un nouveau type de poste est en cours d'enregistrement?
Edit:
La principale source de ma confusion provenait de ne pas comprendre la relation entre phpunit, le WordPress de la suite de tests, mon code de classe, et mon code de test.
Ce que je comprends maintenant, c'est qu'avec le WordPress développeur d'outils installées dans la façon dont le est proposé par ce tutoriel ou par l'intermédiaire de WP-CLI, un appel à la phpunit
charge un fichier de bootstrap qui se connecte le plugin dans le muplugins_loaded
action crochet.Le fichier bootstrap charges puis WordPress environnement de test.Après WordPress a fini de charger le init
crochet est exécuté.Plugin code qui rend l'utilisation de init
devrait fonctionner comme prévu.
Les Tests sont pour la plupart tout à fait normal de code qui rend l'utilisation de fonctions ou de classes.Ce qui est différent, c'est qu'ils sont écrits comme les méthodes d'une classe qui étend la classe WP_UnitTestCase
qui s'étend PHPUnit_Framework_TestCase
.Enveloppé dans cette classe donne les tests d'accès à des assertions et de l'objet des usines, et s'exécute setUp
et tearDown
les méthodes de sorte que chaque test est indépendant des autres.
La solution
Permettez-moi de commencer par dire que le init
action est appelé lorsque WordPress est chargé, avant l'exécution des tests.Donc vous avez votre plugin ou d'un thème chargé avec WordPress (en accrochant dans muplugins_loaded
, par exemple), le register_my_type()
la méthode doit être appelée, si votre constructeur est appelé avant init
.(Si vous n'êtes pas le chargement de votre plugin de cette façon, avoir un regard sur ce tutoriel.)
Donc, dans vos tests unitaires vous devriez être en mesure de le faire:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
Vous pouvez également utiliser get_post_type()
pour vérifier que le type de poste a été enregistré avec les bons arguments.(C'est le même genre de chose que je fais pour vérifier que mon shortcodes sont enregistrés.)
Je ne serais pas s'inquiéter d'essayer de tester que la méthode a été appelée, même si, vous pouvez vérifier la liste des actions en $wp_actions
pour voir si elle a été accroché correctement.Vous pouvez aussi définir une propriété de classe comme un drapeau quand on l'appelle, mais je pense vraiment que tout cela est exagéré.Quand il s'agit de choses accroché à des actions comme init
, en particulier une fonction comme celle-ci qui n'a besoin que de fois, les tests fonctionnels sont votre meilleur pari.Vérifier qu'ils ont fait ce qu'ils sont supposés faire, plutôt que de se concentrer sur la volonté d'une seule unité, comme si la méthode a été appelée.
Cela dit, vous pouvez également tester la méthode enregistre le type de poste par la révocation de l'enregistrement du type de poste et manuellement l'appel de la méthode.WordPress ne semble pas fournir une deregister_post_type()
fonction, alors vous pourriez avoir à jouer avec les $wp_post_types
global directement.Vous pouvez supprimer votre type de poste de de que et appeler la méthode et de vérifier s'il est inscrit à nouveau.