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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top