web-dev-qa-db-fra.com

Écrire un test unitaire pour add_menu_page

J'écris quelques tests unitaires pour un plugin que j'ai développé. Cependant, il semble que je suis suspendu pour tester un (apparemment) simple morceau de code.

Dans le plugin que j'ai écrit, j'ai enregistré une page de menu d'administration:

add_menu_page(
    esc_html__( 'Places', 'wp-places' ),
    esc_html__( 'Places', 'wp-places' ),
    'manage_options',
    'wp-places',
    [ $this, 'places_page' ],
);

Mais je n'arrive pas à proposer un test unitaire pour vérifier que cet élément de menu existe. J'ai déjà vu quelques utilisations de global $menu, mais quand je vérifie le global, il n'est pas encore défini.

Voici les bases de ce que j'ai.

<?php

class AdminTests extends WP_UnitTestCase {

    public function setUp() {

        parent::setUp();

        wp_set_current_user( self::factory()->user->create( [
            'role' => 'administrator',
        ] ) );

        $this->go_to( admin_url() );

    }

    public function test_admin_menu() {

        global $menu;

        print_r( $menu ); // not set

    }

}
4
Gary

Plutôt que de m'inquiéter de l'implémentation interne du code de menu et des fonctions globales qu'il utilise (il y en a plusieurs à côté de $menu), j'utiliserais une fonction comme menu_page_url() pour vérifier si la page existe. Cette fonction renverra l'URL si le menu est enregistré ou une chaîne vide si ce n'est pas le cas. Alors tu pourrais faire:

$this->assertNotEmpty( menu_page_url( 'my_menu_slug' ) );

En outre, vous ne configurez pas le test correctement. La méthode go_to() configure uniquement l'objet WP_Query principal. Elle ne fonctionne pas pour les URL d'administrateur. Vous devez plutôt appeler votre fonction qui enregistre le menu admin. Donc, votre test ressemblerait davantage à ceci:

class AdminTests extends WP_UnitTestCase {

    public function setUp() {

        parent::setUp();

        wp_set_current_user( self::factory()->user->create( [
            'role' => 'administrator',
        ] ) );
    }

    public function test_admin_menu() {

        my_admin_menu_registration_func();

        $this->assertNotEmpty( menu_page_url( 'my_menu_slug' ) );
    }

}
5
J.D.