web-dev-qa-db-ja.com

Add_menu_pageの単体テストを書く

私が開発したプラグインのためにいくつかの単体テストを書いています。しかし、1つの(一見したところ)単純なコードのテストにハングアップしているようです。

私が書いたプラグインで、私は管理者メニューページを登録しました:

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

しかし、このメニュー項目が存在することを確認するための単体テストを考え出すことはできません。私はglobal $menuのいくつかの使用法を見ました、しかし、私がグローバルをチェックするとき、それはまだ設定されていません。

これが私が持っているものの基本です。

<?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

メニューコードの内部実装とそれが使用するグローバルを心配するのではなく($menu以外にもいくつかあります)、ページが存在するかどうかを確認するためにmenu_page_url()のような関数を使用します。その関数は、メニューが登録されている場合はURLを返し、登録されていない場合は空の文字列を返します。だからあなたはできる:

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

また、テストを正しく設定していません。 go_to()メソッドはメインのWP_Queryオブジェクトを設定するだけで、管理URLでは機能しません。代わりに、管理者メニューを登録する関数を呼び出す必要があります。だからあなたのテストはこのように見えるでしょう:

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.